【问题标题】:Receiving Data from Machine using Socket使用 Socket 从机器接收数据
【发布时间】:2021-11-19 06:27:12
【问题描述】:

我是套接字编程的新手。
我正在使用以下代码从病理机器接收传入数据。
 byte[] buffer = new byte[2048];

        IPAddress ipAddress = IPAddress.Parse(SERVER_IP);
        IPEndPoint localEndpoint = new IPEndPoint(ipAddress, PORT_NO);

        Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        try
        {
            sock.Connect(localEndpoint);
        }
        catch (Exception ex)
        {
            throw ex;
        }

        int recv = 0;
        string Printed = string.Empty;
        StringBuilder sb = new StringBuilder();
        while ((recv = sock.Receive(buffer)) > 0)
        {
            if (sock.Receive(buffer).ToString().Length > 1) // I used this line because it's receiving some garbage value all the time.
            {
                sb.Append(Encoding.UTF8.GetString(buffer));
            }
            else
            {
                if (sb.Length > 50 && Printed == string.Empty)
                {
                    Console.WriteLine(sb);
                    Printed = "Y";
                }
            }
        }

我面临的问题

  1. 我的程序没有收到完整的数据。也许是因为这条线if (sock.Receive(buffer).ToString().Length > 1)。但我使用这条线是因为它总是收到一些东西。
  2. 我的程序进入无限循环。我正在寻找在接收到数据后应该停止一段时间并重新开始侦听新传入数据的程序。

【问题讨论】:

  • 你创建了缓冲区,它的 Length 属性总是你给它的任何大小(2048)。 Receive() 方法返回从套接字读取的字节数,因此请执行类似 var bytesRead = sock.Receive(buffer); 的操作。测试(字节读取);使用(缓冲区,字节读取);`
  • @AlanK 我已经在这里完成了while ((recv = sock.Receive(buffer)) > 0)
  • 你需要知道你所期望的框架格式。向您发送数据的机器必须具有构建数据的方式。您需要使用此框架来创建您的阅读要求。

标签: c# sockets


【解决方案1】:

这里有一些东西;

  1. 您需要存储读取计数,并只使用那么多字节,即var bytes = sock.Receive(buffer);(并使用bytes 进行EOF 测试和要处理多少字节)
  2. 这里不能使用ToString().Length > 1,因为它是一个整数,而每一个整数,作为一个字符串,都有一个非零长度;取而代之,简单地说:if (bytes > 0)(细节:一个打开的套接字可以返回零而不意味着 EOF 的情况,但是......它不适用于这里)
  3. 即使对于文本协议,您也必须简单地使用Encoding.UTF8.GetString(buffer, 0, bytes),因为UTF8 是一种多字节编码,这意味着:您可能有部分字符;另外,你还不知道那是一条消息,半条消息,还是14条和一点点消息;你需要阅读协议的“框架”——这可能只是意味着“缓冲字节,直到你看到一个换行符 ('\n') 字符,解码 那些通过编码缓冲的字节,处理该消息,然后重复”

【讨论】:

    猜你喜欢
    • 2021-07-30
    • 1970-01-01
    • 2016-07-24
    • 2010-11-18
    • 2015-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-09
    相关资源
    最近更新 更多