2012-01-10 53 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