Если я хочу узнать, какой процессслушаюна каком сокете, я могу использовать netstat/TCPview и сразу его увижу. Однако можно привязаться к адресу без прослушивания. Если это сделать, он не отображается в netstat/TCPview, но блокирует сокет.
Пример на Python:
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('0.0.0.0',12345))
Порт теперь привязан, и попытка выполнить тот же код во втором экземпляре, пока первый все еще работает, приведет к ошибке. Однако, если вы на самом деле не начнете прослушивать этот порт, используя
s.listen(1)
порт не отображается в netstat/TCPview.
Вопрос в том: Можно ли посмотреть какие порты естьграница(но не слушают), и какой процесс их связывает?
Предыстория этого такова, что у меня былподвижный диапазон 1976 портов, которые не могут быть ограничены, и я хочу знать, что является причиной этого. В то же время, я определил методом проб и ошибок, что Internet Connection Sharing блокирует эти порты, но мне все еще интересно узнать ответ на этот вопрос.
Редактировать:По многочисленным просьбам, вот код, который я использовал для поиска этих портов:
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 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_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;