Vérifier si un port est ouvert

Je n’arrive pas à trouver quoi que ce soit qui me dit si un port de mon routeur est ouvert ou non. Est-ce seulement possible?

Le code que j’ai actuellement ne semble pas vraiment fonctionner …

private void ScanPort() { ssortingng hostname = "localhost"; int portno = 9081; IPAddress ipa = (IPAddress) Dns.GetHostAddresses(hostname)[0]; try { System.Net.Sockets.Socket sock = new System.Net.Sockets.Socket(System.Net.Sockets.AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp); sock.Connect(ipa, portno); if (sock.Connected == true) // Port is in use and connection is successful MessageBox.Show("Port is Closed"); sock.Close(); } catch (System.Net.Sockets.SocketException ex) { if (ex.ErrorCode == 10061) // Port is unused and could not establish connection MessageBox.Show("Port is Open!"); else MessageBox.Show(ex.Message); } } 

Essaye ça:

 using(TcpClient tcpClient = new TcpClient()) { try { tcpClient.Connect("127.0.0.1", 9081); Console.WriteLine("Port open"); } catch (Exception) { Console.WriteLine("Port closed"); } } 

Vous devriez probablement changer 127.0.0.1 en quelque chose comme 192.168.0.1 ou quelle que soit l’adresse IP de votre routeur.

Une meilleure solution où vous pouvez même spécifier un délai d’attente:

 bool IsPortOpen(ssortingng host, int port, TimeSpan timeout) { try { using(var client = new TcpClient()) { var result = client.BeginConnect(host, port, null, null); var success = result.AsyncWaitHandle.WaitOne(timeout); if (!success) { return false; } client.EndConnect(result); } } catch { return false; } return true; } 

Et en F #:

 let IsPortOpen (host: ssortingng, port: int, timeout: TimeSpan): bool = let canConnect = try use client = new TcpClient() let result = client.BeginConnect(host, port, null, null) let success = result.AsyncWaitHandle.WaitOne(timeout) match success with | false -> false | true -> client.EndConnect(result) true with | _ -> (); false canConnect 

Si vous vous connectez à l’ adaptateur de bouclage – localhost ou 127.0.0.1 ( il n’y a pas d’endroit comme 127.0.0.1! ), Il est peu probable que vous vous connectiez au routeur. Le système d’exploitation est suffisamment intelligent pour reconnaître qu’il s’agit d’une adresse spéciale. Je ne sais pas si cela est vrai également si vous spécifiez réellement la “véritable” adresse IP de votre machine.

Voir également cette question: Quel est le but de la carte de bouclage Microsoft?

Notez également que l’exécution de traceroute localhost ( tracert localhost sous Windows) indique que le seul nœud de réseau impliqué est votre propre ordinateur. Le routeur n’est jamais impliqué.

Il n’y a aucun moyen de savoir si le port est transféré dans votre routeur, sauf si un programme écoute ce port.

Comme vous pouvez le constater dans la réponse Clinton, la classe .Net utilisée est TcpClient, car vous utilisez un socket TCP pour vous connecter. C’est ainsi que les systèmes d’exploitation établissent des connexions: à l’aide de sockets. Cependant, un routeur ne fait que transmettre les paquets (couche 3 du modèle OSI). Dans votre cas, votre routeur fait ce qu’on appelle: NAT. C’est une adresse IP publique partagée par une ou plusieurs adresses IP privées. C’est pourquoi vous effectuez une redirection de port.

Il peut y avoir beaucoup de routeurs dans le chemin des paquets et vous ne saurez jamais ce qui s’est passé.

Imaginons que vous envoyez une lettre de manière traditionnelle. Vous pouvez peut-être écrire dans la lettre que le destinataire doit vous répondre afin de vérifier qu’il / elle est là (vous et le destinataire sont les sockets). Si vous recevez une réponse, vous serez sûr de sa présence, mais si vous ne recevez rien, vous ne savez pas si le facteur (dans votre cas, le routeur) a oublié de remettre la lettre, ou le destinataire n’a pas a répondu. De plus, vous ne saurez jamais si le facteur a demandé à un ami de remettre cette lettre. De plus, le facteur ne ouvrira pas la lettre pour savoir s’il peut répondre parce que vous attendez une réponse. Tout ce que vous pouvez faire est d’attendre un peu de temps pour recevoir la réponse. Si vous ne recevez rien pendant cette période, vous supposerez que le destinataire n’est pas celui où vous avez envoyé la lettre. C’est un “timeout”.

J’ai vu une réponse mentionnant le logiciel nmap. C’est vraiment un très bon et complexe soft, mais je pense que cela fonctionnera de la même manière. Si aucune application n’écoute dans ce port, il n’y a aucun moyen de savoir si elle est ouverte ou non.

S’il vous plaît, laissez-moi savoir si j’étais clair.

Un transfert de port sur le routeur ne peut pas être testé depuis le réseau local. Vous devez vous connecter depuis le côté WAN (Internet) pour voir si un transfert de port fonctionne ou non.

Plusieurs sites Internet offrent des services pour vérifier si un port est ouvert:

Quel est mon scanner de port IP

GRC | ShieldsUP!

Si vous souhaitez vérifier avec votre propre code, vous devez vous assurer que la connexion TCP / IP est redirigée via un proxy externe ou qu’un tunnel est configuré. Cela n’a rien à voir avec votre code, c’est un réseau de base 101.

 public static bool PortInUse(int port) { bool inUse = false; IPGlobalProperties ipProperties = IPGlobalProperties.GetIPGlobalProperties(); IPEndPoint [] ipEndPoints = ipProperties.GetActiveTcpListeners(); foreach(IPEndPoint endPoint in ipEndPoints) { if(endPoint.Port == port) { inUse = true; break; } } return inUse; } 

Pour moi, il me fallait quelque chose de bloquant jusqu’à ce que la connexion au port soit disponible ou après un certain nombre de tentatives. Donc, j’ai compris ce code:

 public bool IsPortOpen(ssortingng host, int port, int timeout, int retry) { var retryCount = 0; while (retryCount < retry) { if (retryCount > 0) Thread.Sleep(timeout); try { using (var client = new TcpClient()) { var result = client.BeginConnect(host, port, null, null); var success = result.AsyncWaitHandle.WaitOne(timeout); if (success) return true; client.EndConnect(result); } } catch { // ignored } finally { retryCount++; } } return false; } 

J’espère que cela t’aides!