Se eu quiser descobrir qual processo está escutando em qual soquete, posso usar o netstat / TCPview e o vejo imediatamente. No entanto, é possível vincular a um endereço sem ouvir. Se isso for feito, ele não será exibido no netstat / TCPview, mas bloqueará o soquete.
Exemplo de Python:
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('0.0.0.0',12345))
A porta está agora ligada e a tentativa de executar o mesmo código em uma segunda instância enquanto a primeira ainda estiver em execução resultará em um erro. No entanto, a menos que você realmente comece a ouvir nessa porta usando
s.listen(1)
a porta não aparece no netstat / TCPview.
A questão é: é possível ver quais portas estão ligadas (mas não estão escutando) e qual processo as está vinculando?
O fundo deste é que eu já tinha uma faixa de movimento de 1976 portas que não podem ser vinculados , e eu quero saber o que causa isso. Enquanto isso, determinei por tentativa e erro que o compartilhamento de conexão com a Internet estava bloqueando essas portas, mas ainda estou curioso sobre a resposta a essa pergunta.
Edit: Devido ao pedido popular, aqui está o código que eu usei para encontrar essas portas:
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"
(você pode canalizar a saída para grep e filtrar apenas FAIL)
Respostas:
você deveria usar
com
Valor de TableClass = TCP_TABLE_OWNER_PID_ALL "ou" TCP_TABLE_OWNER_PID_CONNECTIONS "ou" TCP_TABLE_OWNER_PID_LISTENER
Estrutura pTcpTable -> MIB_TCPTABLE_OWNER_PID
dependendo da informação que você deseja recuperar
EDITAR:
TCP_TABLE_OWNER_PID_ALL retorna a estrutura MIB_TCPTABLE_OWNER_PID que é uma matriz de estruturas MIB_TCPROW_OWNER_PID onde cada uma
dwState
deve terMIB_TCP_STATE_CLOSED
quando ligada e não escuta, essa estrutura também oferecedwLocalAddr
edwLocalPort
fonte
Nas versões recentes do netstat, agora existe um parâmetro de linha de comando -q que mostra esses soquetes.
Exemplo de uso:
Parece que não existe uma API pública para obter os soquetes nessa situação. Veja minha pergunta no StackOverflow .
fonte