2011-02-12 37 views
-1

现在让我们在这里我们使用了一种锁插槽接受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,套接字仍然阻塞,并在接收端有一些错误,现在在接收端,我们将通过捕获套接字来处理4000字节ecxecption

是否有任何保证,即发送端的套接字不会丢失仍然为的1000个字节发送套接字是否知道截断它们,如果他试图再次接收它不会被我们接收到的第一个字节wasent断开连接?

我在问的是: a)tcp是否有一些mecanisem告诉套接字处理其余的消息? b)是否有我们可以发送或接收的套接字标志,告诉缓冲区处理剩余的消息?

+0

你的代码和你的大部分问题没有多大意义。可能是因为你误解TCP只提供一个流,并不能保证数据包的任何信息。 – CodesInChaos 2011-02-12 16:21:27

回答

1

首先,TCP/IP operates on streams, not packets。因此,无论缓冲区大小,阻塞呼叫或MTU如何,您都需要协议中的某种消息帧。

其次,每个TCP连接是独立的。当出现通信错误时,正常设计为close a socket。然后可以建立一个新的套接字连接,它完全独立于旧连接。

+0

你完全错过了这一点, 我知道它可以在河流上工作.. – 2011-02-12 23:30:04