Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中接收TCP/IP套接字数据时出现问题#_C#_.net_Sockets - Fatal编程技术网

C# 在C中接收TCP/IP套接字数据时出现问题#

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

在调试模式下,我通过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字节,它工作正常。不过,在执行过程中,我接收到的数据长度为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”。