################################################################################ ●ソケットがクローズしてくれないので無理矢理クローズする ################################################################################ しばしば、TCP切断後、再度Connectするまでに20秒〜4分程度かかってしまい、この時間 を短縮してほしいと言う要望がある。 システム的には、メッセージが完全に終了した事を確認できないため危険を含んではいる が以下の方法で対応可能である。 1.TIME_WAIT状態について TIME_WAIT状態においては、再度Connectする事は出来ません。この状態は下記の理由に より仕様となっています。 @TCPは全ての転送データを可能な限り配送することが保証されている。 Aソケットを閉じたとき、サーバは、全てのデータが届いたことを間違いなく確認する ために、 TIME_WAIT 状態に入ります。 Bソケットが閉じ られると、両側からお互いにメッセージを送りあうことによって、 これ以上はもう送る データが無いということを合意します。 CこのBの後に、やっとソケットが閉じられなければならない。 D最後のACKが通信に成功したことを確認する方法がないことと、漂流中の重複パケッ トがネットワーク上に残っているかも知れないことを懸念すると仕方ないというより 当然の仕様です。 2.TIME_WAIT状態からの復旧 TIME_WAIT状態を避ける事で、再度Connectが即時に可能です。 方法はソケットオプションの「SO_LINGER」をsetsockopt()でセットする事です。 注意) @通常のTCPコネクション終了(FIN/ACK/FIN/ACK)の代わりに SO_LINGER オプションを 設定してRSTを送ってはいけません。 3.ソケットオプションの設定 //切断後の再接続を即可能にするソケットオプション設定 linger_opt.l_onoff = 1;  // リンガー設定(0=OFF,1=ON) linger_opt.l_linger = 0;  // リンガー時間 optRtn = setsockopt( fd, SOL_SOCKET, SO_LINGER, (const char*)&linger_opt, sizeof(linger));