c# - 使用 Socket 从机器接收数据

标签 c# sockets


我对套接字编程非常陌生。
我正在使用以下代码接收来自病理机器的传入数据。

 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. 我的程序进入无限循环。我正在寻找在接收数据后应停止一段时间并再次开始监听新传入数据的程序。

最佳答案

这里有一些事情;

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

关于c# - 使用 Socket 从机器接收数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69340946/

相关文章:

python-3.x - 如何重用套接字地址python?

c - C Socket编程中的多个客户端

node.js - socket.io 错误 - Web 套接字连接在建立连接之前关闭

c# - 模型中的 Display 属性是否违反了关注点与 View 和模型的分离

c# - 为什么我们需要创建类变量来获取和设置属性?

c# - 是否有些 Func 无法转换为等价的表达式?

c# - 如何截屏 "preview"窗口?

c# - 如何在不加载内容的情况下计算 EntityFramework 中的行?

C 套接字 : FD_ISSET return true with no data waiting

java - 如何正确关闭非阻塞套接字 channel ?