Determinando qual processo ligou uma porta (sem escutar) no Windows

12

Se eu quiser descobrir qual processo está escutando em qual soquete, eu posso usar o netstat / TCPview e o verei 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 em Python:

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('0.0.0.0',12345))

A porta está agora vinculada e a tentativa de executar o mesmo código em uma segunda instância, enquanto a primeira ainda está em execução, resultará em erro. No entanto, a menos que você realmente comece a escutar nessa porta usando

s.listen(1)

a porta não aparece em netstat / TCPview.

A questão é: É possível ver quais portas estão ligadas (mas não ouvindo) e qual processo as vincula?

O contexto disso é que tenho um alcance móvel de portas 1976 que não podem ser ligadas , 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.

Editar: Devido à solicitação popular, aqui está o código que 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 querer canalizar a saída para grep e filtrar apenas para FAIL)

    
por Jan Schejbal 26.02.2013 / 16:12

1 resposta

1

você deve usar

DWORD GetExtendedTcpTable (PVOID pTcpTable,PDWORD pdwSize, BOOL bOrder, ULONG ulAf, TCP_TABLE_CLASS TableClass,ULONG Reserved );

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 das informações 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 dwState deve ter MIB_TCP_STATE_CLOSED quando ligado e não escutando, essa estrutura também oferece dwLocalAddr e 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;
    
por 19.03.2013 / 17:35