Если я хочу выяснить, какой процесс прослушивает какой сокет, я могу использовать 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 года, которые не могут быть связаны , и я хочу знать, что вызывает это. Тем временем я методом проб и ошибок определил, что общий доступ к подключению к Интернету блокирует эти порты, но мне все еще интересно узнать ответ на этот вопрос.
Изменить: Из-за популярного запроса, вот код, который я использовал, чтобы найти эти порты:
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)
Ответы:
ты должен использовать
с
Значение 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
источник
В последних версиях netstat теперь есть параметр командной строки -q, который показывает эти сокеты.
Пример использования:
Кажется, в этой ситуации нет открытого API для получения сокетов. Смотрите мой вопрос в StackOverflow .
источник