プロが教える店舗&オフィスのセキュリティ対策術

【現状】
VC#でソケット通信のソフトを作成しています。

【問題】
クライアント―サーバ型のソケット通信をしようとしているのですが、切断後すぐに再接続できないという問題が生じております。

【調査結果】
調べたところ、TCP/IPの状態遷移でアクティブクローズ側がTIME_WAIT状態になることが分かっています。TIME_WAITの設定値には意味合いがあり、漂流中の重複パケットの問題を回避するためや最後のACK再送のためであることは理解しております。

【やりたいこと】
今回は基本的に1:1通信でルータを挟まずにやりとりするネットワークなので、TIME_WAITを0、もしくは数msecにしたいと考えています。
※ 同じIPアドレス、ポート番号で接続したい為(ポート固定での再接続)

【自分で出した解決案の一つ】
どうもサーバ(Listenする側)からアクティブクローズすると、TIME_WAITは生じるもののクライアントから接続要求を出すと同じポートからでももう一度接続できてしまうというのは判明したので、必ずサーバから切断要求を出す仕様にすればTIME_WAITが0になるように思われます。
ただし、なぜ再接続できるのかは不明のため、すっきりしない(&環境や設定が異なると再接続できない可能性あり)

【質問】
(1) クライアント側からアクティブクローズする場合に、TIME_WAIT状態を1秒未満に設定する方法はありますか?(VC#で)
(2) サーバからアクティブクローズした場合に、なぜ再接続できてしまうのでしょうか?

以上の2点の質問に、どうかご回答のほどよろしくお願いいたします。

A 回答 (1件)

> どうもサーバ(Listenする側)からアクティブクローズすると、TIME_WAITは生じるもののクライアントから接続要求を出すと同じポートからでももう一度接続できてしまうというのは判



ちゃんと双方了解のもとで close() できなかったときのこと言ってるなら
int optval = 1;
if (setsockopt (s, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof optval))
しとけという話ではなくて?

この回答への補足

SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, false);
SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
の両方を試しましたが、特に変化なしでした。
使い方がまずいのかと色々調べましたが、TIME_WAITとの関係性についてしっかりと記述しているサイトもなく、不明のままです。

補足日時:2015/01/14 17:04
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!