どのようなプロセスなのか知りたい場合は聞いているどのソケットで実行されているかは、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 のみをフィルタリングすることもできます)
答え1
今日はまさにこれをやらなければなりませんでした。Powershell ではこれが可能ですGet-NetTCPConnection
。
PS C:\WINDOWS\system32> Get-NetTCPConnection -LocalPort 53100
LocalAddress LocalPort RemoteAddress RemotePort State AppliedSetting OwningProcess
------------ --------- ------------- ---------- ----- -------------- -------------
0.0.0.0 53100 0.0.0.0 0 Bound 40120
PS C:\WINDOWS\system32> get-process -PID 40120
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------- ------ ----- ----- ------ -- -- -----------
2133 1331 13884 30740 30,955.31 40120 1 HWMonitorPro
答え2
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の質問。
答え3
使用すべき
DWORD GetExtendedTcpTable (PVOID pTcpTable、PDWORD pdwSize、BOOL bOrder、ULONG ulAf、TCP_TABLE_CLASS TableClass、ULONG 予約済み);
と
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_TCPTABLE_OWNER_PID構造体を返します。これはMIB_TCPROW_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;