繁体   English   中英

C#套接字接收搞乱了数据

[英]C# Socket Receive messes up data

我正在尝试创建一个通过套接字进行通信的客户端/服务器应用程序。 但是,当我收到数据时,它被随机弄乱了,并且并不总是 (有时)显示正确的数据。 我用来接收数据的代码:

private static void ReceiveCallback(IAsyncResult AR)
{
     try
     {
        Socket socket = (Socket)AR.AsyncState;
        if (SocketConnected(socket))
        {
           int received = socket.EndReceive(AR);
           byte[] dataBuf = new byte[received];
           Array.Copy(_buffer, dataBuf, received);
           string text = Encoding.ASCII.GetString(dataBuf);
           if (!text.Contains("GET") && !text.Contains("HTTP") && text != null)
           {
                Console.WriteLine(DateTime.Now.ToString("h:mm:ss tt") + ":" + text);
           }
           socket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), socket);
         }
      }
      catch
      {

      }   
}

有人可以解释我为什么会这样吗? 提前致谢!

另外,我尝试检查直到找到一个字符(在每个响应“-”的末尾,但这都行不通)。 结果很不幸: 输出量

我假设您的套接字是TCP套接字,因为您正在处理HTTP之类的东西。

TCP处理流,而不处理消息。 因此,当您进行读取时,最多会从流中读取_buffer.Length个字节。 这意味着您可以轻松地读取响应的一部分,或者将响应分为多个回调。 当您偶然阅读足够的书时,一切都会按预期进行。 在localhost上进行测试时尤其如此,因为Windows对localhost TCP的对待与非localhost的区别非常大。 但是,如果发生这种情况,您可能阅读充分, text将不会包含整个响应-并且您的数据已损坏。

此外,当received为零,这意味着对方已经关闭了流,你应该停止做BeginReceive

您必须循环接收套接字,直到获得完整的消息。

这也意味着您必须具有应用程序级协议。 什么定义了一条消息?

终止符? 然后循环读取,直到获得该字符。

字符数? 然后循环读取,直到得到那么多字符。

消息的长度是否在消息的开头? 然后循环直到获得足够的字节来获取长度,然后循环直到获得整个消息。

您的套接字代码对我来说不错。 .Net世界中的字符编码格式为“ Unicode”,您应该将收到的字节转换为Unicode而不是ASCII:

string text = Encoding.Unicode.GetString(dataBuf);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM