-1

IOCP の概念でクライアント サーバー通信を使用するアプリケーションを作成しました。

クライアントは、ワイヤレス アクセス ポイントを介してサーバーに接続します。

ネットワークで一時的な切断が発生すると、CLOSE_WAIT 状態になる可能性があります。これは、クライアントが接続を適切に閉じたことを示している可能性があります。しかし、サーバーはまだソケットを開いています。ポート (サーバーとクライアントが通信していたポート) のインスタンスが CLOSE_WAIT 状態にある場合、最高のピーク時にサーバーが機能を停止し、接続が拒否されます。これは完全にイライラします。この場合、ユーザーは再起動する必要があります。サーバーはメモリをクリアしてすべての close_wait 状態を一掃します.サーバーが再起動すると、クライアントは再びサーバーに接続しようとします.サーバーはacceptコマンドを再度呼び出します.しかし,新しい接続を受け入れる前に,以前の接続はサーバー側で閉じられる必要があります,どのように私たちはそれを行うことができますか?

サーバーを再起動せずにソケットの close_wait 状態を削除するにはどうすればよいですか?

サーバーの再起動を回避する別の方法はありますか?

また、使用可能なすべてのエフェメラル ポートがクライアント アプリケーションに割り当てられると、クライアントで TCP/IP ポートの枯渇と呼ばれる状態が発生することもわかりました。TCP/IP ポートが枯渇すると、クライアント ポートを予約できなくなり、TCP/IP ソケット経由でサーバーに接続しようとするクライアント アプリケーションでエラーが発生します。これが発生している場合は、クライアント TCP/IP ソケット接続に動的に割り当てられるエフェメラル ポートの上限範囲を増やす必要があります。

参照: http://msdn.microsoft.com/en-us/library/aa560610%28v=bts.10%29.aspx

この別の方法が役立つかどうか教えてください。

前もって感謝します。

よろしくエイミー

4

1 に答える 1

0

サーバー コードを修正します。

サーバーはタイムアウトで読み取りを行う必要があり、タイムアウトが切れた場合はソケットを閉じる必要があります。

于 2013-03-20T11:26:50.093 に答える