En C # pour utiliser un TcpClient ou généralement pour se connecter à une socket, comment puis-je d'abord vérifier si un certain port est libre sur ma machine?
plus d'infos: Voici le code que j'utilise:
TcpClient c;
//I want to check here if port is free.
c = new TcpClient(ip, port);
Réponses:
Puisque vous utilisez un
TcpClient
, cela signifie que vous vérifiez les ports TCP ouverts. Il existe de nombreux bons objets disponibles dans l' espace de noms System.Net.NetworkInformation .Utilisez l'
IPGlobalProperties
objet pour accéder à un tableau d'TcpConnectionInformation
objets, que vous pouvez ensuite interroger sur l'adresse IP et le port du point de terminaison.la source
netstat -a -b
. Notez que lesLISTENING
connexions ne sont pas présentes dans leGetActiveTcpConnections()
. Vous devriez également vous enregistrerSystem.Net.IPEndPoints[]
retourné paripGlobalProperties.GetActiveTcpListeners();
Vous êtes du mauvais côté de l'Intertube. C'est le serveur qui ne peut avoir qu'un seul port ouvert. Un peu de code:
Échoue avec:
la source
Lorsque vous configurez une connexion TCP, le 4-tuple (source-ip, source-port, dest-ip, dest-port) doit être unique - ceci afin de garantir que les paquets sont livrés au bon endroit.
Il y a une autre restriction sur le serveur côté laquelle un seul programme serveur peut se lier à un numéro de port entrant (en supposant une adresse IP; les serveurs multi-NIC ont d'autres pouvoirs mais nous n'avons pas besoin de les discuter ici).
Donc, côté serveur, vous:
Du côté du client, c'est généralement un peu plus simple:
Il n'est pas nécessaire que l'adresse IP / le port de destination soit unique, car cela permettrait à une seule personne à la fois d'utiliser Google, et cela détruirait assez bien son modèle commercial.
Cela signifie que vous pouvez même faire des choses aussi merveilleuses que le FTP multi-session puisque vous configurez plusieurs sessions où la seule différence est votre port source, vous permettant de télécharger des morceaux en parallèle. Les torrents sont un peu différents en ce que la destination de chaque session est généralement différente.
Et, après tout cela (désolé), la réponse à votre question spécifique est que vous n'avez pas besoin de spécifier un port franc. Si vous vous connectez à un serveur avec un appel qui ne spécifie pas votre port source, il utilisera presque certainement zéro sous les couvertures et le système vous en donnera un inutilisé.
la source
Vous avez mal compris ce qui se passe ici.
Les paramètres TcpClient (...) sont l'IP du serveur et le port du serveur auquel vous souhaitez vous connecter.
Le TcpClient sélectionne un port local transitoire dans le pool disponible pour communiquer avec le serveur. Il n'est pas nécessaire de vérifier la disponibilité du port local car il est automatiquement géré par la couche winsock.
Dans le cas où vous ne pouvez pas vous connecter au serveur à l'aide du fragment de code ci-dessus, le problème peut être un ou plusieurs. (c'est-à-dire que l'adresse IP et / ou le port du serveur est incorrect, le serveur distant n'est pas disponible, etc.)
la source
Merci pour cette astuce. J'avais besoin de la même fonctionnalité mais du côté du serveur pour vérifier si un port était utilisé, je l'ai donc modifié en ce code.
la source
-anb
) et sans aucun paramètre, elle affiche la connexion étrangère ainsi que l'état.merci pour la réponse jro. J'ai dû le peaufiner pour mon usage. J'avais besoin de vérifier si un port était écouté, et pas nécessairement actif. Pour cela j'ai remplacé
avec
J'ai itéré le tableau des points finaux en vérifiant que ma valeur de port n'a pas été trouvée.
la source
la source
netstat! C'est un utilitaire de ligne de commande réseau fourni avec Windows. Il montre toutes les connexions actuellement établies et tous les ports actuellement écoutés. Vous pouvez utiliser ce programme pour vérifier, mais si vous souhaitez le faire à partir du code, regardez dans l'espace de noms System.Net.NetworkInformation? C'est un nouvel espace de noms à partir de 2.0. Il y a quelques goodies là-bas. Mais finalement, si vous voulez obtenir le même type d'informations disponibles via la commande netstat, vous devrez obtenir P / Invoke ...
Mise à jour: System.Net.NetworkInformation
Cet espace de noms contient un tas de classes que vous pouvez utiliser pour comprendre des choses sur le réseau.
Je n'ai pas pu trouver ce vieux code mais je pense que vous pouvez écrire quelque chose de similaire vous-même. Un bon début est de consulter l' API IP Helper . Google MSDN pour la fonction GetTcpTable WINAPI et utilisez P / Invoke pour énumérer jusqu'à ce que vous ayez les informations dont vous avez besoin.
la source
Si je ne me trompe pas beaucoup, vous pouvez utiliser System.Network.wwhat pour vérifier.
Cependant, cela entraînera toujours une condition de course.
La méthode canonique de vérification est d'essayer d'écouter sur ce port. Si vous obtenez une erreur, le port n'était pas ouvert.
Je pense que cela explique en partie pourquoi bind () et listen () sont deux appels système distincts.
la source
Vous dites
Mais vous pouvez toujours vous connecter à un port pendant que d'autres l'utilisent si quelque chose y écoute. Sinon, le port http 80 serait un gâchis.
Si ton
échoue, alors rien n'y écoute. Sinon, il se connectera, même si une autre machine / application a une prise ouverte sur cette adresse IP et ce port.
la source
ipGlobalProperties.GetActiveTcpConnections()
ne renvoie pas les connexions dans l'état d'écoute.Le port peut être utilisé pour l'écoute, mais sans personne connectée, la méthode décrite ci-dessus ne fonctionnera pas.
la source
Des ports disponibles, j'exclure:
Avec l'importation suivante:
Vous pouvez utiliser la fonction suivante pour vérifier si un port est disponible ou non:
Je vous donne une fonction similaire pour ceux qui utilisent VB.NET :
la source
Pour répondre à la question exacte de trouver un port libre (ce dont j'avais besoin dans mes tests unitaires) dans dotnet core 3.1, j'ai proposé ceci
note: basé sur le commentaire de @ user207421 sur le port zéro, j'ai cherché et trouvé ceci et l' ai légèrement modifié.
la source
Soyez conscient de la fenêtre de temps entre vous faites la vérification et le moment où vous essayez d'établir une connexion, un processus peut prendre le port - TOCTOU classique . Pourquoi n'essayez-vous pas simplement de vous connecter? En cas d'échec, vous savez que le port n'est pas disponible.
la source
Vous n'avez pas besoin de savoir quels ports sont ouverts sur votre machine locale pour vous connecter à un service TCP distant (sauf si vous souhaitez utiliser un port local spécifique, mais ce n'est généralement pas le cas).
Chaque connexion TCP / IP est identifiée par 4 valeurs: IP distante, numéro de port distant, IP local, numéro de port local, mais il vous suffit de connaître l'adresse IP distante et le numéro de port distant pour établir une connexion.
Lorsque vous créez une connexion TCP en utilisant
Votre système attribuera automatiquement l'un des nombreux numéros de port locaux gratuits à votre connexion. Vous n'avez rien à faire. Vous pouvez également vérifier si un port distant est ouvert. mais il n'y a pas de meilleur moyen de le faire que d'essayer simplement de s'y connecter.
la source
la source
la source
Recherchez le code d'erreur 10048
la source
essayez ceci, dans mon cas, le numéro de port de l'objet créé n'était pas disponible, alors j'ai trouvé ceci
la source