Se eu quiser descobrir qual é o processoaudiçãoem qual soquete, posso usar netstat/TCPview e o verei imediatamente. No entanto, é possível vincular-se a um endereço sem escutar. Se isso for feito, ele não aparecerá 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 agora está 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 no netstat/TCPview.
A questão é: É possível ver quais são as portasvinculado(mas não ouvindo), e qual processo os está vinculando?
O pano de fundo disso é que tive umfaixa móvel de portas de 1976 que não podem ser vinculadas, e 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 para saber a resposta a esta 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)
Responder1
Eu tive que fazer exatamente isso hoje. O Powershell pode fazer isso com o 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
Responder2
Nas versões recentes do netstat existe agora um parâmetro de linha de comando -q que mostra esses soquetes.
$ 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.
...
Exemplo de uso:
$ 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
...
Parece que não existe uma API pública para obter os soquetes nessa situação. Veja meupergunta no StackOverflow.
Responder3
você deveria usar
DWORD GetExtendedTcpTable (PVOID pTcpTable, PDWORD pdwSize, BOOL bOrder, ULONG ulAf, TCP_TABLE_CLASS TableClass, ULONG Reservado);
com
Valor 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 é um array de estruturas MIB_TCPROW_OWNER_PID onde cada uma dwState
deve ter MIB_TCP_STATE_CLOSED
quando ligada e não escutando, esta estrutura também oferece dwLocalAddr
edwLocalPort
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;