2012-02-23 4 views
0

私は、サーバーとして動作するWin32コンソールアプリケーションを作成する途中です。私は機能を受け入れるためにタイムアウトを設定しなければなりません。ポートのシャットダウンを10秒で接続しなくてもかまいません。私が知っている通り、ここにはいくつかの方法があります:winsock accept関数のタイムアウトを設定するには?

  1. 非同期方法。しかし、私はwsaasyncselect関数を使用することはできませんので、コンソールアプリケーションを書いています。

  2. 選択機能付き。しかし、この方法は安全ではないという言葉があります。クライアントがRSTパッケージを送信してからオフラインにした場合、select関数はこのソケットが読み込み可能であり、accept関数が永遠にそこに保持されると考えます。

  3. アラーム機能付き。まず、このようなアプリケーションでは予期せぬことに使用しないようにします。第2に、スレッドセーフであるかどうかを心配しています。

ここでは、受け入れ機能のタイムアウト、スレッドセーフでなければならない人、より良い良い方法を見つける方法を誠実に尋ねています。

+0

ソケットを非ブロックにして、 'select'を使います。受け入れるものがなければ 'accept'はエラーを返し、' WSAGetLastError'は 'WSAEWOULDBLOCK'を返します。 –

+0

また、[accept'のドキュメント(http://msdn.microsoft.com/en-us/library/windows/desktop/ms737526(v = vs.85).aspx)によれば、接続が'accept'を呼び出す前に終了しました。これは' WSAECONNRESET'エラーで返されます。 –

+2

@JoachimPileborg:ソケットがブロックしていても、 'accept()'を呼び出す前に 'select()'を使うことができます。 –

答えて

0

ソケットを非ブロックにします(@JoachimPileborgが示唆するように)。

ソケットを非ブロックにする呼び出しは、FIONBIOパラメータでioctlsocketです。

例プログラムhereがあります。

関連する問題