go-back-n ウィンドウを使用して、基本的な UDP ソケット ファイル転送サーバー/クライアントのセットアップに取り組んでいます。
通常、未処理のパケットのタイムアウトを管理するには、signal() を使用するだけですが、これが実際に Windows でどのように機能するか、またはこれが実際に最適なソリューションであるかどうかについては不明です。この種のソケット タイムアウトを処理する最善の方法はありますか? それとも、select() でタイムアウトを管理するのが最善ですか?
アプリケーションに「main()」関数がある場合、select() を使用してタイムアウトを管理するのが最も便利です。ソケット API 呼び出しのみを使用するという利点があるため、コードは bsd スタイルのソケット API をサポートするすべてのプラットフォームで動作するはずです。 Windows メッセージ ループは必要ありません。
ウィンドウ GUI スタイルのアプリケーションを作成している場合 (通常はWinMain()
エントリ ポイントとメッセージ ループをWSAAsyncSelect
使用)、ソケット ハンドルの () は、HWND に投稿された読み取り (および書き込み) 準備完了の通知メッセージを取得します。SetTimer
同様に、定期的なWM_TIMER
通知を投稿しGetTickCount
ます。アイドル状態が長すぎるソケットを検出するために使用されます。