[英]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.