Si je veux savoir quel processus écoute sur quel socket, je peux utiliser netstat / TCPview et le verrai immédiatement. Cependant, il est possible de se lier à une adresse sans l'écouter. Si cela est fait, il n'apparaît pas dans netstat / TCPview, mais bloque le socket.
Exemple Python:
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('0.0.0.0',12345))
Le port est maintenant lié et toute tentative d'exécution du même code dans une seconde instance alors que la première est toujours en cours d'exécution entraînera une erreur. Cependant, à moins que vous ne commenciez réellement à écouter sur ce port en utilisant
s.listen(1)
le port n'apparaît pas dans netstat / TCPview.
La question est: est-il possible de voir quels ports sont liés (mais pas à l'écoute), et quel processus les lie?
L'arrière - plan de c'est que j'ai eu une gamme mobile de ports de 1976 qui ne peuvent être liés , et je veux savoir ce qui cause cela. Dans l'intervalle, j'ai déterminé par essais et erreurs que le partage de connexion Internet bloquait ces ports, mais je suis toujours curieux de savoir la réponse à cette question.
Edit: En raison de la demande populaire, voici le code que j'ai utilisé pour trouver ces ports:
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"
(vous voudrez peut-être diriger la sortie vers grep et filtrer pour FAIL uniquement)
Réponses:
Tu devrais utiliser
avec
Valeur TableClass = TCP_TABLE_OWNER_PID_ALL "ou" TCP_TABLE_OWNER_PID_CONNECTIONS "ou" TCP_TABLE_OWNER_PID_LISTENER
Structure de pTcpTable -> MIB_TCPTABLE_OWNER_PID
en fonction des informations que vous souhaitez récupérer
ÉDITER:
TCP_TABLE_OWNER_PID_ALL renvoie la structure MIB_TCPTABLE_OWNER_PID qui est un tableau de structures MIB_TCPROW_OWNER_PID où chacune
dwState
devrait avoir uneMIB_TCP_STATE_CLOSED
fois liée et non à l'écoute, cette structure offre égalementdwLocalAddr
etdwLocalPort
la source
Dans les versions récentes de netstat, il existe désormais un paramètre de ligne de commande -q qui affiche ces sockets.
Exemple d'utilisation:
Il semble qu'il n'y ait pas d'API publique pour obtenir les sockets dans cette situation. Voir ma question dans StackOverflow .
la source