现在让我们使用一个secnario,我们使用锁定套接字接收,数据包是5000字节 将receivetimeout设置为一秒
s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 1000);
int bytes_recevied = 0 ;
byte [] ReceiveBuffer = new byte[8192] ;
try
{
bytes_received = s.Receive(RecevieBuffer) ;
}
catch(SocketException e)
{
if( e.ErrorCode == 10060)
{
Array.Clear(ReceiveBuffer,0,ReceiveBuffer.Length);
}
}
现在我们的secnario规定4000字节已经扔掉alreadys,套接字仍然阻塞,接收端有一些错误, 现在在接收端,我们将通过捕获套接字ecxecption
手动处理4000个字节是否保证发送端的套接字不会丢失1000字节 当我们尝试再次接收时,发送套接字是否知道要截断它们,而不是它们是我们收到的第一个字节?
我要问的是: a)tcp是否有一些mecanisem告诉套接字处理其余的消息? b)是否有一个我们可以发送或接收的套接字标志告诉缓冲区处理其余的消息?
答案 0 :(得分:1)
首先,TCP/IP operates on streams, not packets。因此,无论缓冲区大小,阻塞呼叫或MTU如何,您都需要在协议中使用某种消息帧。
其次,每个TCP连接都是独立的。当出现通信错误时,正常设计为close a socket。然后可以建立一个新的套接字连接,它完全独立于旧套接字。