C# 在C中接收TCP/IP套接字数据时出现问题#
在调试模式下,我通过TCP/IP套接字接收3144字节的数据,但在执行中接收到1023字节。为什么不读取剩余的数据C# 在C中接收TCP/IP套接字数据时出现问题#,c#,.net,sockets,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
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字节,它工作正常。不过,在执行过程中,我接收到的数据长度为1023字节。为什么会发生这种情况?我需要在消息框
或文本框
中打印收到的数据str
,您似乎假设您将在一次接收
呼叫中收到所有数据。TCP/IP是一种流协议——你不应该这样假设
您需要循环,读取尽可能多的数据。理想情况下,您的协议应该告诉您如何将数据作为每个“消息”(或您的等效概念)的一部分进行读取,或者在完成写入后关闭套接字。在这两种情况下,当你读过所有的东西时,你就会知道了。另一种选择是包含一个分隔符,这意味着您在阅读完整的“消息”时仍然可以知道,但您也可能已经阅读了下一条消息的开头。您似乎假设您将在一次
接收
调用中接收所有数据。TCP/IP是一种流协议——你不应该这样假设
您需要循环,读取尽可能多的数据。理想情况下,您的协议应该告诉您如何将数据作为每个“消息”(或您的等效概念)的一部分进行读取,或者在完成写入后关闭套接字。在这两种情况下,当你读过所有的东西时,你就会知道了。另一种选择是包含一个分隔符,这意味着您在阅读完整的“消息”时仍然可以知道,但您也可能已经阅读了下一条消息的开头。您应该在循环中接收部分数据,直到获得全部。
请看下面的代码:
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);
}
void接收(套接字、字节[]缓冲区、整数偏移量、整数大小)
{
接收到的int=0;
做{
试一试{
received+=socket.Receive(缓冲区、偏移量+接收、大小-接收、SocketFlags.None);
}
}while(接收<大小);
}
您应该在一个循环中接收部分数据,直到获得全部数据。请看下面的代码:
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);
}
void接收(套接字、字节[]缓冲区、整数偏移量、整数大小)
{
接收到的int=0;
做{
试一试{
received+=socket.Receive(缓冲区、偏移量+接收、大小-接收、SocketFlags.None);
}
}while(接收<大小);
}
选择代码并单击“101010”图标以获得编辑版本中的良好格式选择代码并单击“101010”图标以获得编辑版本中的良好格式如何在不使用“socket.available”的情况下找到套接字中的可用字节。如何在不使用“socket.available”的情况下找到套接字中的可用字节“socket.Available”。