dポイントプレゼントキャンペーン実施中!

FTPのように、制御と転送の2つのポートを利用し、送信元リモートホストごとにforkして対応するTCPサーバプログラムを利用しています。
ここで、OS側から、制御ポート(ログイン等)のコネクションは切断しないで、転送ポートのコネクションだけを切断したいと思うのですが、可能でしょうか。
1つのプロセスが、1つのホストとの制御、転送、両方のコネクションを担当するので、プロセスをkillするわけにはいきません。

Macでは、IPNetMonitorというGUIアプリケーションで、TCPコネクションごとの切断ができるので、Linuxでも可能ではないかと思うのですが...
環境は、redhat7.3です。
よろしくお願いします。

A 回答 (2件)

iptableにルールを追加して、パケットを拒否するようにするとか。


切断するわけでないので、一生待ちという事態になるかもしれませんが。

カーネルレベルでの強制切断ってのは、危ないのではないかと。
下手にこれができると、迷子のパケットが到達した時に、通信に混乱が生じる恐れがありそうな。

やはりプログラムレベルで、ちゃんとshutdown/closeしてやるように、管理インタフェースを追加すべきですね。

この回答への補足

>iptableにルールを追加して、パケットを拒否するようにするとか。

現在はこれを行っているのですが、CLOSEまでの時間が、アプリケーション層の実装に依ってしまうのと、元々80ちかいルールを設定しているので、あとからリストをみてルール番号を確認するのが大変面倒なのです。

>カーネルレベルでの強制切断ってのは、危ないのではないかと。
下手にこれができると、迷子のパケットが到達した時に、通信に混乱が生じる恐れがありそうな。

言われている意味が分かりません。
現在のTCP/IPで、不測の切断や、迷子のパケットによって、他に影響があるとは思えないのですが?
特にTCPでは、アクティブクローズ側はTIME-WAITで2MSL間待機しますので、カーネルレベルの切断(FINの送信)によって、迷子のパケットや不測の切断という状況はまず起こりえないですし、上位層が対応できないこともないのでしょう(通信相手がフリーズしただけでバグってしまうことになる...)
上の方法の方が、TCPコネクションを正常に終了しないので、よくないのでは?

>やはりプログラムレベルで、ちゃんとshutdown/closeしてやるように、管理インタフェースを追加すべきですね。

これでは、そういった操作がしたいアプリケーション全てのソースを修正する必要があります。
少なくとも、Macでは、簡単に実現できるので、なんとかならないかなお考えているのですが。
通信の両ホストのアドレスとポートを指定して、FINパケットを送出するだけなので、どこかにそんなツールはないでしょうか?

補足日時:2002/09/23 18:57
    • good
    • 2

ごめんなさい。

質問の意図がよくわかりません。
コネクションごとにソケットがオープンされているので、切断したいソケットを
クローズすればいいと思うのですが。

ソケットプログラミングに関する参考サイトを3つ紹介しておきますのでご覧ください。
http://www.kt.rim.or.jp/~ksk/sock-faq/unix-socke …
http://www.ueda.info.waseda.ac.jp/~toyama/network/
http://x68000.startshop.co.jp/~68user/net/

この回答への補足

プログラミングの話ではなく、OSレベルの話です。
上記サーバによって、下記のコネクションがあった場合に、ソフトウェア外から、強制的に192.168.0.1:2421だけ切断したいのです。
ソフトウェア自身の機能としてではありません。
この例に限らず、プロセスのkillではなくて、コネクションだけを切断することができないでしょうか?

[root@hostname]# netstat -tn
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 192.168.0.1:2420 192.168.1.3:49170 ESTABLISHED
tcp 0 0 192.168.0.1:2421 192.168.1.3:49174 ESTABLISHED
tcp 0 0 192.168.0.1:2420 192.168.1.24:52744 ESTABLISHED
tcp 0 0 192.168.0.1:2421 192.168.1.24:52751 ESTABLISHED

補足日時:2002/09/22 16:46
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
すいません、補足でちょっと間違えを。
切断したいのは、192.168.0.1:2421と192.168.1.3:49174間のコネクションです。

お礼日時:2002/09/22 16:51

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