Socket.Send最佳实践

时间:2012-01-10 10:33:12

标签: c#

我正在尝试改进一些网络代码,在这里我需要使用Socket.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();
}

但是,我不确定偏移量,因为它基于零,这可能会导致偏移量在每个循环中丢失一个字节,或者我错了吗?

此外,还有其他最佳做法需要关注吗?

1 个答案:

答案 0 :(得分:0)

MSDN文章说:

  

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

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