[DotNet] Vérifier la disponibilité d’un port en écoute

dotnet microsoft

Nous vivons dans un monde surconnecté, c’est pourquoi la plupart des applications utilisent une architecture Client / Serveur afin de communiquer et transmettre des données.

Lorsqu’on développe une application Serveur qui va se mettre en écoute sur un ou plusieurs ports il est primordial de vérifier leur disponibilité.

En effet, sur une même machine il est impossible de mettre 2 applications en écoute sur le même port.

Voici la solution que j’utilise pour effectuer cette vérification de port listener.

Détecter la disponibilité d’un port

Pour tester la disponibilité d’un port en écoute (listener), il existe plusieurs méthodes:

  • lancer une commande “netstat -an” et parser le résultat afin de savoir quels ports sont déjà sollicités.
  • lancer une mise en écoute du port et si çà sa vautre on considère que le port est déjà pris (c’est moche de faire çà mais c’est souvent utilisé)
  • chercher les ports consommés en WMI
  • regarder les ports utilisés par tous les processus ouverts

Mais ces astuces (pour ne pas dire bidouilles) ne me conviennent pas car elles sont soit lourdes à mettre en place et à développer, soit carrément immondes ! Franchement tester le crash d’une commande pour valider la disponibilité d’un port c’est porc !

Je vous propose donc d’utiliser le framework DotNet et l’assembly System.Net.NetworkInformation afin de vérifier si on peut utiliser un listener sur un port spécifique.

Méthode propre pour vérifier la disponibilité d’un port

La fonction suivante se base sur l’assembly System.Net.NetworkInformation (penser donc à ajouter les références et à faire l’import) pour savoir si un port UDP ou TCP est déjà utilisé en tant que listener (serveur).

Voici donc ma fonction CheckAvailableServerPort:

'Imports System.Net.NetworkInformation
'Fonction qui permet de vérifier si un port serveur est déjà utilisé par la machine
Public Function CheckAvailableServerPort(ByVal port As UShort, ByVal isTCP As Boolean) As Boolean
    Dim isAvailable As Boolean = True
    Dim igp As IPGlobalProperties = IPGlobalProperties.GetIPGlobalProperties()
    Dim endpoints As IPEndPoint() = Nothing
    If isTCP Then
        endpoints = igp.GetActiveTcpListeners()
    Else
        endpoints = igp.GetActiveUdpListeners()
    End If
    For Each ep As IPEndPoint In endpoints
        If ep.Port = port Then
            isAvailable = False
            Exit For
        End If
    Next
    Return isAvailable
End Function

Encore une fois le framework DotNet nous a permis de faire une petite fonction bien pratique en quelques lignes seulement :-)

Enjoy !

3 Responses to [DotNet] Vérifier la disponibilité d’un port en écoute

  1. Perso j’aurais opté pour l’ouverture/fermeture d’un socket serveur sur le port à tester, et retourné false en cas d’erreur…

    Bon évidemment maintenant que je sais qu’on peut lister tous les ports occupés… Merci pour l’info!

    J’assume ma cochonitude :)

    Nico

    • jhd says:

      Nico j’ai bien avancé sur ma printeuse. A tout hasard je cherche quelques personnes pour faire un prototype afin de pouvoir rectifier et corrigé les éventuels soucis. Evidemment j’ai un prototype mais une personne de plus serait la bienvenue. Si ca te dit contacte moi et je t’envoie les STL.

      • Hey, ça fait plaisir!
        Je ne sais pas si j’aurai le temps de faire un prototype ces jours, ni ces semaines, mais je suis bien curieux de voir un plan!
        Mon extrudeur est naze, j’attends une vis d’entrainement…
        C’est une delta alors?

Leave a Reply

Your email address will not be published. Required fields are marked *