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