我正在使用C#Socket类通过短连接向/从我们的服务器发送/接收TCP消息。伪代码(排除一些虚假容忍逻辑以表明清楚)如下。
class MyTCPClient {
private Socket mSocket;
MyTCPClient() {
mSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
}
void Connect(ipEndpoint, sendTimeOut, receiveTimeOut) {
mSocket.Connect(ipEndpoint);
mSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendTimeout, sendTimeOut);
mSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, receiveTimeOut);
}
void Send(msg) {
mSocket.Send(msg);
}
void Receive(data) {
ByteStreamWriter bsw = new ByteStreamWriter();
int totalLen = 0;
while (true) {
byte[] temp = new byte[1024];
int len = mSocket.Receive(temp, SocketFlags.None);
System.Threading.Thread.Sleep(50); // This is the weirdest part
if (len <= 0) break;
totalLen += len;
bsw.WriteBytes(temp);
}
byte[] buff = bsw.GetBuffer();
data = new byte[totalLen];
Array.Copy(buff, 0, data, 0, totalLen);
}
~MyTCPClient() {
mSocket.Close();
}
}
我使用此类通过短连接多次从我们的服务器请求相同的消息,并且发生了以下事情(仅当消息大小大于一个MTU - 1500字节时)。
我可以保证,每次我们的服务器都发送了正确的数据,客户端也在TCP层收到了正确的数据(我使用WireShark通过我使用的端口监控所有消息)。是否有人可以帮助解答为什么我的C#代码无法获得正确的数据?
另外,如果我使用mSocket.Available而不是Socket.Receive()的返回值来判断while循环,我总会得到正确的数据和数据长度......
答案 0 :(得分:2)
在编写之前,不要将temp
截断为len
个字节。 len
中temp
之后的所有字节都没有填充当前数据,因此包含无意义的陈旧日期。
复制到其他信息流时,您可以使用stream.Write(temp, 0, len)