C# { b应断开连接=真; //接收到0字节;假设断开连接信号 打破 } 淹没区+=N字节; nStartIndex+=nBytesRead; } 返回Encoding.Default.GetString(byteBuffer,0,nDataAread); }

C# { b应断开连接=真; //接收到0字节;假设断开连接信号 打破 } 淹没区+=N字节; nStartIndex+=nBytesRead; } 返回Encoding.Default.GetString(byteBuffer,0,nDataAread); },c#,c++,networking,tcp,C#,C++,Networking,Tcp,让我们知道这对您没有帮助(0:祝您好运。按“数据包大小”例如,你是说IPv4限制为65507字节?对不起,我的意思是MTU-我编辑了我的答案以反映这一点。TCP保证数据的成功传输,但不是数据包-请参阅我关于重新传输的回复。@Matthew Scharley,从TCP客户端的角度来看,TCP确实保证它按顺序传输数据报。底层IP地址是并非如此,它可能会重新排序,但这是TCP的内部细节。数据包也是如此。但OP担心它们。你是对的,我认为接收应用程序将始终按顺序接收它们。但它们不一定按顺序发送到计算机。或

让我们知道这对您没有帮助(0:祝您好运。

按“数据包大小”例如,你是说IPv4限制为65507字节?对不起,我的意思是MTU-我编辑了我的答案以反映这一点。TCP保证数据的成功传输,但不是数据包-请参阅我关于重新传输的回复。@Matthew Scharley,从TCP客户端的角度来看,TCP确实保证它按顺序传输数据报。底层IP地址是并非如此,它可能会重新排序,但这是TCP的内部细节。数据包也是如此。但OP担心它们。你是对的,我认为接收应用程序将始终按顺序接收它们。但它们不一定按顺序发送到计算机。或者你可以像SMTP一样,包括一个终止符字符串(.在它自己的行上)
void CChatSocket::OnReceive(int nErrorCode)
{
   CSocket::OnReceive(nErrorCode);

   DWORD dwReceived;

   if (IOCtl(FIONREAD, &dwReceived))
   {
      if (dwReceived >= dwExpected)   // Process only if you have enough data
         m_pDoc->ProcessPendingRead();
   }
   else
   {
      // Error handling here
   }
}
strMsg = ReadData(thisTcpClient.Client, 1000, out bDisconnected);
    string ReadData(Socket sckClient, int nBytesToRead, out bool bShouldDisconnect)
    {
        bShouldDisconnect = false;

        byte[] byteBuffer = new byte[nBytesToRead];
        Array.Clear(byteBuffer, 0, byteBuffer.Length);

        int nDataRead = 0;
        int nStartIndex = 0;

        while (nDataRead < nBytesToRead)
        {

            int nBytesRead = sckClient.Receive(byteBuffer, nStartIndex, nBytesToRead - nStartIndex, SocketFlags.None);

            if (0 == nBytesRead)
            {
                bShouldDisconnect = true;
                //0 bytes received; assuming disconnect signal
                break;
            }

            nDataRead += nBytesRead;
            nStartIndex += nBytesRead;
        }

        return Encoding.Default.GetString(byteBuffer, 0, nDataRead);
    }