私は既存のすべてのTCP接続ごとの接続を列挙するコードを実装しようとしています(netstat -lptn
と同様)。私はそれを自分で実装し、netstat
に依存しないことを好みます。それを行うために、 /proc/<PID>/net/tcp
からデータを解析しています。
多くのTCP接続が/proc/<PID>/net/tcp
の下にリストされていますが、netstat -lptn
コマンドによってリストされていないことがわかりました。
たとえば、/proc/1/net/tcp
と/proc/2/net/tcp
にはいくつかのTCP接続が存在することがわかります(Ubuntu 16で試してみました)。私が理解しているように、/proc/1/net/tcp
は/sbin/init
プロセスに関連しており、TCP接続。/proc/2/net/tcp
はkthreadd
に関連しており、これもTCP接続を持つことはできません。
あなたのアプローチには多くの誤解があります。 1つずつ説明します。
dup2
、fork
、およびファイル記述子を渡すなどのさまざまなメソッドを介して、同じソケットへの参照を多数作成して、参照カウントを増やすことができます。 。これらの参照の一部は、オープンファイル記述子テーブルからのものであり、それ自体が多くのスレッドで使用できます。これらのスレッドは、同じスレッドグループ(PID)または異なるスレッドグループに属している場合があります。 netstat
に-p
フラグを使用すると、各プロセスがアクセスできるソケットが列挙され、既知の各ソケットのプロセスを見つけようとします。候補となるプロセスが複数ある場合、関心のあるプロセスを示しているとは限りません。/proc/<PID>/net/tcp
は、そのプロセスに関連するソケットを一覧表示するだけではありません。そのプロセスが属するネットワーク名前空間内のすべてのTCPv4ソケットが一覧表示されます。デフォルトの構成では、システム上のすべてのプロセスが単一のネットワーク名前空間に属しているため、どのPIDでも同じ結果が得られます。これは、ネットワークを使用しないスレッド/プロセスがこのファイルにコンテンツを持っている理由も説明します。それ自体がネットワークを使用しない場合でも、他のプロセスがネットワークを使用する可能性があるネットワーク名前空間に属しています。/proc/<PID>/net/tcp
には、リスニングソケットと接続されたソケットの両方が含まれています。 -l
をnetstat
に渡すと、待機しているソケットのみが表示されます。出力をより一致させるには、-a
ではなく-l
が必要です。/proc/<PID>/net/tcp
には、TCPv4ソケットのみが含まれています。すべてのTCPソケットを表示するには、/proc/<PID>/net/tcp6
も使用する必要があります。独自のプロセスと同じ名前空間のソケットのみに関心がある場合は、異なるPIDを反復処理する必要はありません。 /proc/net/tcp
は/proc/net/tcp6
へのシンボリックリンクであるため、代わりに/proc/net
および/proc/self/net
を使用できます。