在C#中接收TCP / IP套接字数据的问题

时间:2010-09-23 15:00:44

标签: c# .net sockets

我在调试模式期间通过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个字节。为什么会这样?我需要在strMessageBox中打印收到的数据TextBox

2 个答案:

答案 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);
}