IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Lister Port TCP Ouvert


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut Lister Port TCP Ouvert
    Je voudrais que mon application ne fasse rien jusqu'à temps qu'un port TCP précis soit libéré.
    voici le code que j'ai utilisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    System.Net.IPEndPoint t = new IPEndPoint(System.Net.Dns.Resolve(Dns.GetHostName()).AddressList[0], 5070);
    Socket g = new Socket(t.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
    g.Bind(t);
    while(g.Connected)
    {
    	System.Threading.Thread.Sleep(5000);
    }
    Le port en question est ouvert par une autre application (je n'ai pas le code de cette application en question).

    J'ai fait des recherche à l'aide de et je suis désespéré de voir que très peut de page traite du sujet (alors qu'il y en a tout plein pour les autres langages) à croire qu'en c# on ouvre pas les ports sois même .

    Sur le forum c# je n'ai pas trouvé grand chose à l'aide de la recherche .

    L'équivalent d'un netstat devrait me suffir, d'ailleurs demain je vais voir si je peut récupérer la valeur retour d'un netstat, et dans ce cas je passerais par cela .

  2. #2
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Pour récupérer les ports utilisés (en écoute ou connectés), tu auras tout ce qu'il te faut ici avec les méthodes GetActive....

  3. #3
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    Merci pour ton aide, mais j'ai oublié de préciser que je suis en .Net 1.1 et je n'ai pas le namespace System.Net.NetWorkInformation ce qui est bien dommage .

    Actuellement je suis en train de lire ce tutorial et j'essaye d'obtenir ce que je veux en passant par la méthode pool.
    Mais cela ne fonctionne toujours pas .
    Bon je pense que mon code n'est pas encore bon, je suis en train de voir pourquoi.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    System.Net.IPEndPoint t = new IPEndPoint(System.Net.Dns.Resolve(Dns.GetHostName()).AddressList[0], 5070);
    Socket g = new Socket(t.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
    bool free = false;
    while(!free)
    {
    	if (g.Poll(10,SelectMode.SelectRead) && g.Available == 0)
    		free = true;
    	else
    		free = false;
    	System.Threading.Thread.Sleep(5000);
    }

  4. #4
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    Bon une avancée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g.Poll(10,SelectMode.SelectRead)
    me renvois toujours false même lorsque le port est libéré (observation avec netstat).

    me renvois toujours 0 mais vu ma condition ce n'est pas génant.

    Je ne sais pas si je suis partis sur la bonne voix : Utiliser une socket pour me connecter à un port qui est déjà occupé pour savoir quand il ne le sera plus.

    J'ai vu que je peut aussi utiliser bind qui me renvois une exception si le port est utilisé par un autre, mais je preférerais éviter de gérer cette détection par une exception.

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    j'ai oublié de préciser que je suis en .Net 1.1 et je n'ai pas le namespace System.Net.NetWorkInformation
    Tu as une raison particulière de rester en 1.1 ? Cette version est carrément obsolète, on en est quand-même à la 3.5 (beta)...

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Par défaut
    Il y a plus simple pour tester si le port est libre sans utiliser dotnet2
    c'est pas propre mais ca marche.

    Quand tu créé une socket et la bind sur un port, a ce moment elle est juste initialisée et créée par le système mais en aucun cas, celle-ci n'a encore d'insidence sur la pile TCP/IP.

    Si tu essaie d'écouter un port "occupé, en activant la socket en mode écoute... elle va directement quitter en t'expliquant son mécontentement...
    Selon les méthodes par une exception ou un résultat. Tu traite ce résultat, ou si c'est une exception tu l'attrape avec un try catch...
    certes le mécanisme des exceptions est lent, mais dans ton cas, je crois qu'on s'en tappe un peu, si je puis m'exprimer ainsi.

    Si le résultat est une exception où le fait que le port soit pas dispo... tu as gagné tu attend et refait l'opération, sinon tu passe à la suite.
    Attention toutefois avec le caractère blocant des sockets sous dotnet. Je ne sais plus si la mise en écoute bloque l'appelant en dotnet, normallement non, si le modele de fonctionnement de sockets, en temps normal, a été préservé.

    Sinon je suis d'avis comme les autres que tu change enfin de technologie... dotnet 1.1 est plus qu'obsolete de nos jours, déjà meme dotnet 2.0 est obsolète si l'on veut bien (si on fait abstraction du fait que le 3 soit la meme chose que le 2 plus des ajouts par ci par la).

    Je ne saurais trop te conseiller un passage à dotnet 3.0. Après tout si tu n'utilise pas les namespace spécifiques à dotnet 3... il est possible (sous certaines contraintes) de faire fonctionner les appli ainsi générée avec dotnet2.

    Il n'est pas fondamentallement nécessaire de passer à dotnet 3.5... surtout que le mieux pour cela, serait de passer à Orcas sous vista (VS2008).

  7. #7
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    Oui.
    Dans l'entreprise où je travaille, tous les postes sont restés en framework 1.1
    Passé ne serait qu'au 2.0 m'obligerais à rajouter à mon installeur l'update du framework.
    Donc je passerais d'un installeur de taille < à 1000 KO à un installeur de taille > à 60 MO.
    Cela poserais pas mal de difficulté d'avoir un installeur de cette taille et en dehors du problème que j'ai actuellement, je n'avais pas besoin des nouvelles fonctionnalités, présentent à partir du 2.0, pour mon outil.
    En plus de cela, mon outil est installé sur une plateforme de pré-production sensible et que je ne maitrise pas (dans le sens où c'est pas moi qui m'occupe de la plateforme et qui installe mon outil, je ne fait que livrer), donc rajouter une installation supplémentaire, même si elle n'est sensé posé aucun problème (jamais vu planté l'update du framework), c'est rajouté un risque potentielle d'erreur.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Vérifier si un port tcp est ouvert
    Par Coussati dans le forum Débuter
    Réponses: 13
    Dernier message: 05/02/2009, 17h33
  2. Tester si un port TCP est ouvert
    Par Melodie dans le forum API, COM et SDKs
    Réponses: 7
    Dernier message: 03/03/2008, 09h06
  3. Laisser le port série ouvert ?
    Par BECHE dans le forum Windows
    Réponses: 4
    Dernier message: 09/11/2005, 09h38
  4. [MySQL] lire le contenu d'un port TCP
    Par manaboko dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 03/10/2005, 18h39
  5. lister port serie
    Par aure26 dans le forum C++Builder
    Réponses: 2
    Dernier message: 02/05/2005, 12h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo