2012-01-10 43 views
2

我试图改进我们的一些网络代码,在这里我需要使用Socket.SendSocket.Send最佳实践

但是,MSDN指出开发人员自己有责任处理重试,并且由于Socket.Send方法不需要在单个请求中发送所有数据(取决于缓冲区大小),因此我决定使用以下循环:

try 
{ 
    int timeout = TimeSpan.FromSeconds(10).Milliseconds; 
    int waitTime = TimeSpan.FromMilliseconds(30).Milliseconds; 

    Socket socket = tcpClient.Client; 
    socket.SendTimeout = timeout ; 

    int offset = 0; 

    while (offset != data.Length) 
    { 
     if (socket.Poll(waitTime , SelectMode.SelectWrite)) 
     { 
      offset += socket.Send(data, offset, data.Length - offset, SocketFlags.None); 
     } 
    } 
} 
catch (SocketException) 
{ 
    tcpClient.Close(); 
} 

不过,我不确定有关的偏移量,因为它是从零开始的,这可能会导致偏移这里每个循环缺少一个单字节,还是我错了?

另外,有没有其他的最佳实践需要关注?

回答

0

MSDN文章说:

返回值类型:发送到 插槽字节System.Int32数。

所以我不担心它。我唯一的最佳实践建议是考虑使用WCF,它比.NET中的套接字更容易使用,并且更加可靠,特别是对于任何复杂的事情。

+0

WCF不适合电子产品;-) – 2012-01-10 11:40:41

+0

啊:)嗯,你的代码应该可以正常工作。过去我通过增加一个偏移量来做类似的事情:) – NibblyPig 2012-01-10 11:48:18