2012-02-17 19 views
6

私はReceiveTimoutを40ミリ秒と指定しました。しかし、受信がタイムアウトするまでに500ms以上かかる。私はタイムウォッチを計算するためにストップウォッチを使用しています。ソケット受信タイムアウト

コードを以下に示します。

Socket TCPSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, 
           ProtocolType.Tcp); 
TCPSocket.ReceiveTimeout = 40; 

try 
{ 
    TCPSocket.Receive(Buffer); 

} catch(SocketException e) { } 
+1

。 – rekire

答えて

0

私はこの1つを見つけた:

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 

IAsyncResult result = socket.BeginConnect(sIP, iPort, null, null); 

bool success = result.AsyncWaitHandle.WaitOne(40, true); 

if (!success) 
{   

      socket.Close(); 
      throw new ApplicationException("Failed to connect server."); 
} 
+0

私はReceiveを非同期ではない同期にする必要があります。また、受信タイムアウトが発生した場合、ソケットを閉じたくはありません。 –

7

あなたは同期あなたが望む任意のタイムアウトをソケットにポーリングすることができます。 Poll()trueを返す場合は、ブロックされないReceive()に電話をかけることができます。

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 
} 

私はあなたが、非ブロッキングソケットの使用状況に関するより詳細な情報については、章6と16のプログラミングスティーブンスUNIXネットワークを読むことをお勧めします。この本の名前にUNIXがあるにもかかわらず、ソケット全体のアーキテクチャーは本質的にUNIXとWindows(および.net)で同じです。

2

500ms未満のタイムアウト値は使用できません。 SendTimeoutについてはこちらをご覧ください:MSDNはReceiveTimeoutに同じ要件を述べていないにもかかわらずhttp://msdn.microsoft.com/en-us/library/system.net.sockets.socket.sendtimeout

、私の経験では、この制限がまだあることを示しています。

また、いくつかのSOの記事にこの詳細を読むことができます:いくつかのより多くのコードを入力してください

関連する問題