どのプロセスがどのソケットでlisteningであるかを知りたい場合は、netstat/TCPviewを使用すると、すぐに確認できます。ただし、リッスンせずにアドレスにバインドすることは可能です。これが行われると、netstat/TCPviewには表示されませんが、ソケットはブロックされます。
Pythonの例:
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('0.0.0.0',12345))
これでポートがバインドされ、最初のインスタンスがまだ実行されている間に2番目のインスタンスで同じコードを実行しようとすると、エラーが発生します。ただし、実際にそのポートでリッスンを開始しない限り、
s.listen(1)
ポートはnetstat/TCPviewに表示されません。
問題は次のとおりです:どのポートがバインドされているか(ただしリッスンしていない)、どのプロセスがそれらをバインドしているかを確認することは可能ですか?
この背景は私が 持ってるバインドできない1976ポートの移動範囲 があり、これの原因を知りたいです。その間、試行錯誤の結果、インターネット接続の共有がこれらのポートをブロックしていると判断しましたが、この質問に対する答えにはまだ興味があります。
編集:よくあるリクエストにより、これらのポートを見つけるために使用したコードは次のとおりです。
import time
import socket
for i in range(0,65536):
try:
print "Listening on port", i, '...',
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.bind(('0.0.0.0', i))
serversocket.listen(5)
#time.sleep(0.1)
serversocket.close()
print "ok"
except:
print "FAIL"
(出力をgrepにパイプし、FAILのみをフィルタリングすることをお勧めします)
あなたが使用する必要があります
DWORD GetExtendedTcpTable(PVOID pTcpTable、PDWORD pdwSize、BOOL bOrder、ULONG ulAf、TCP_TABLE_CLASS TableClass、ULONG Reserved);
と
TableClass値= TCP_TABLE_OWNER_PID_ALL "または" TCP_TABLE_OWNER_PID_CONNECTIONS "または" TCP_TABLE_OWNER_PID_LISTENER
pTcpTable構造-> MIB_TCPTABLE_OWNER_PID
取得したい情報に応じて
編集:
TCP_TABLE_OWNER_PID_ALLは、MIB_TCPROW_OWNER_PID構造体の配列であるMIB_TCPTABLE_OWNER_PID構造体を返します。この構造体は、バインドされてリッスンしていないときに、各dwState
にMIB_TCP_STATE_CLOSED
が必要です。この構造体は、dwLocalAddr
とdwLocalPort
も提供します。
typedef struct _MIB_TCPROW_OWNER_PID {
DWORD dwState;
DWORD dwLocalAddr;
DWORD dwLocalPort;
DWORD dwRemoteAddr;
DWORD dwRemotePort;
DWORD dwOwningPid;
} MIB_TCPROW_OWNER_PID, *PMIB_TCPROW_OWNER_PID;
最近のバージョンのnetstatには、これらのソケットを表示するコマンドラインパラメーター-qがあります。
$ netstat -?
Displays protocol statistics and current TCP/IP network connections.
NETSTAT [-a] [-b] [-e] [-f] [-n] [-o] [-p proto] [-r] [-s] [-x] [-t] [interval]
-a Displays all connections and listening ports.
-b Displays the executable involved in creating...
...
-p proto Shows connections for the protocol specified...
-q Displays all connections, listening ports, and bound
nonlistening TCP ports. Bound nonlistening ports may or may not
be associated with an active connection.
-r Displays the routing table.
...
使用例:
$ netstat -nq -p tcp
Active Connections
Proto Local Address Foreign Address State
TCP 0.0.0.0:7 0.0.0.0:0 LISTENING
TCP 0.0.0.0:9 0.0.0.0:0 LISTENING
TCP 0.0.0.0:13 0.0.0.0:0 LISTENING
...
TCP 192.168.122.157:50059 54.213.66.195:443 ESTABLISHED
TCP 0.0.0.0:49676 0.0.0.0:0 BOUND
TCP 0.0.0.0:49700 0.0.0.0:0 BOUND
TCP 0.0.0.0:49704 0.0.0.0:0 BOUND
TCP 0.0.0.0:49705 0.0.0.0:0 BOUND
...
そのような状況でソケットを取得するためのパブリックAPIはないようです。私の StackOverflowの質問 を参照してください。