7

MSDN のドキュメントによると、Socket.SendTimeout を 500 ミリ秒未満の値に設定することはできません: http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.sendtimeout同じルールが有効ですSocket.ReceiveTimeout (MSDN のドキュメントには記載されていませんが、どちらのケースも実際にテストされているため、これは事実です)。

たとえば、完了までに 10 ミリ秒以上かかる場合、ソケット受信操作をタイムアウトにする他の方法はありますか?

4

1 に答える 1

9

簡単な答えは「あなたはしない」です。

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)で基本的に同じです。

于 2012-05-29T02:27:37.290 に答える