我在调试模式期间通过TCP / IP套接字接收3144字节的数据,但是在执行时接收到1023个字节。为什么没有读取剩余数据?
IPEndPoint ipEnd = new IPEndPoint(ipAdd, ipPort);
Socket soc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
soc.Connect(ipEnd);
byte[] sendData = Encoding.ASCII.GetBytes("msg");
soc.Send(sendData);
int byteLen = 4*1024;
byte[] RecData = new byte[byteLen];
int DataLen = soc.Receive(RecData, 0, RecData.Length, SocketFlags.None);// Here I placed breakpoint
string str = Encoding.ASCII.GetString(RecData, 0, DataLen);
MessageBox.WriteLine(str);
soc.Close();
一步一步调试我得到DataLen
为3144字节并且它正常工作。但是在执行期间,我收到的DataLen
为1023个字节。为什么会这样?我需要在str
或MessageBox
中打印收到的数据TextBox
。
答案 0 :(得分:3)
您似乎假设您将在一次Receive
电话中收到所有数据。 TCP / IP是一种流媒体协议 - 您不应该做出这样的假设。
您需要循环播放,尽可能多地读取数据。理想情况下,您的协议应该告诉您如何将数据作为每个“消息”(或任何等效概念)的一部分进行读取,或者在完成写入时关闭套接字。在任何一种情况下,你都会知道你什么时候读过的。另一种方法是包含一个分隔符,这意味着你仍然知道你什么时候阅读完整的“消息” - 但你也可能会读取下一条消息的开头。
答案 1 :(得分:1)
你应该循环接收部分数据,直到你全部收到。
看看下面的代码:
void Receive(Socket socket, byte[] buffer, int offset, int size)
{
int received = 0;
do {
try {
received += socket.Receive(buffer, offset + received, size - received, SocketFlags.None);
}
} while (received < size);
}