2012-05-28 41 views
6

根據MSDN文檔,不能將Socket.SendTimeout設置爲小於500毫秒的值:http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.sendtimeout對於Socket.ReceiveTimeout,相同的規則是有效的(即使它不是在MSDN文檔中提到,這是事實,因爲兩種情況都經過實際測試)。在.NET中將套接字發送/接收超時設置爲小於500ms

是否有任何其他方式來超時套接字接收操作,如果它,例如,需要大於10ms更長的時間來完成?

+0

什麼是錯的'Socket.ReceiveTimeout'設置爲10ms? – Reniuz

+0

檢查這個http://stackoverflow.com/questions/9327326/socket-receivetimeout – Ras

+0

我做了一個測試Socket.ReceiveTimeout設置爲10米。大約500ms後都失敗了,所以我認爲這裏也適用同樣的規則,即使它沒有在文檔中提及。 – donatasm

回答

8

簡單的答案是「你不要」。

Send()Receive()調用阻止程序的流程,直到數據發送,接收或發生錯誤。

如果您想對通話有更多的控制權,可以使用多種機制。最簡單的是使用Poll()

Socket s; 
// ... 
// Poll the socket for reception with a 10 ms timeout. 
if (s.Poll(10000, SelectMode.SelectRead)) 
{ 
    s.Receive(); // This call will not block 
} 
else 
{ 
    // Timed out 
} 

您還可以使用Select()BeginReceive()ReceiveAsync()其他類型的行爲。

我建議你讀Stevens的UNIX網絡編程第6和第16的更深入的信息,非阻塞套接字使用。雖然這本書在其名稱中具有UNIX,整體插座架構基本上是在UNIX和Windows(和.net)相同

+1

非常感謝您的回答和參考。那是我需要的。 – donatasm