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 :

Voir les ports ouverts


Sujet :

C++

  1. #1
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut Voir les ports ouverts
    Salut!

    Je me suis mis depuis peu de temps aux sockets et j'ai fait une application serveur-client trés basique inspirée de tutos,
    et grâce a l'aide que j'ai reçue sur ce forum.

    Au debut du programme on demande a l'utilisateur sur quel port il veut se connecter,sur la machine locale:127.0.0.1;
    comment faire pour vérifier si le port dont le numéro a été entré est ouvert,
    pour ne pas induire de conflit avec d'autres applications en cours,notamment systeme.

    Existe t'il une fonction qui renvoie l'état d'un port?

    Merci de votre aide!
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Je ne comprends pas ce que tu veux faire: Vérifier avec le client qu'un port est ouvert ? tu ne peux le faire qu'en tentant de te connecter dessus...


    Par contre, coté serveur, le mieux est d'essayer: Tu tentes un bind(), et s'il échoue avec la bonne erreur (sous Winsock, c'est WSAEADDRINUSE, je crois), c'est que le port est déjà ouvert par un autre programme...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Merci d'avoir répondu aussi vite!

    En fait j'ai deux prog:le serveur et le client;
    quand je lance le serveur il faut rentrer le port sur lequel il se "placera"...
    puis je lance le client où là aussi on rentre le port où il faut se connecter,a priori celui du serveur.

    Ce que je voudrais c'est que le serveur ne se serve pas d'un port déjà prit ou fermé.

    Merci pour l'astuce mais n'y a t'il pas une fonction plus "directe"
    qui scanne un port et verifie qu'il est ouvert pour lancer le serveur dessus?
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  4. #4
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    J'ai tenté ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
        sockaddr_in connection;
        connection.sin_family=AF_INET;
        connection.sin_addr.s_addr=INADDR_ANY;
     
        int flag;
        int j=0;
        int t[200];
     
        for(int i=1;i<1024;i++){
     
                               connection.sin_port=htonl(i);
                               flag=bind(sock,(SOCKADDR*) &connection,sizeof(connection));
                               cout<<i<<"   "<<flag<<endl;
                               if(flag==WSAEADDRINUSE){
                                               t[j]=i;
                                               j++;
                                               }
                               }   
     
        for(int i=0;i<j;i++){
                cout<<"le port : "<<t[j]<<" est occupé"<<endl;
                }
    Le tableau t[] garde les ports occupé pour un affichage après la boucle.

    Mais il m'indique que tout va bien sur tout les ports alors que sur le 80 j'ai un serveur apache; alors que dans une apllication où je ne fais qu'un seul test sur le port 80 il me renvoie bien l'erreur 10048 qui indique que le port est ocupé.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    C'est bizarre, il me semblait qu'un socket bindé ne pouvait plus être rebindé par la suite...
    Quand j'avais moi-même fait un vérifieur de ports, J'étais obligé de fermer et recréer le socket à chaque fois...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Citation Envoyé par Médinoc
    C'est bizarre, il me semblait qu'un socket bindé ne pouvait plus être rebindé par la suite...
    Quand j'avais moi-même fait un vérifieur de ports, J'étais obligé de fermer et recréer le socket à chaque fois...
    Justement! J'ai un probleme!

    C'est peut être ça qui fait qu'il ne me renvoie pas les "bonnes réponses"...

    Je teste en recréant le socket à chaque fois...

    Merci pour la piste!
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  7. #7
    b4u
    b4u est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 87
    Points : 64
    Points
    64
    Par défaut
    ca me parait bizzare que par default, tu puisses reutiliser la socket sans l'avoir fermee...
    Essaye en inserant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    bool set = false;
    setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (const char*)&set, sizeof(set));
    entre tes appels a socket() et bind() pour voir si change qqchse?

  8. #8
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Cette fois j'ai tout mit dans la boucle!

    Tout est recréé à chaque fois!

    C'est plus long...et ça change rien

    Voilà le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    #include <cstdlib>
    #include <iostream>
    #include <winsock2.h>
     
    using namespace std;
     
    int main(int argc, char *argv[])
    {
     
     
     
        int flag;
        int j=0;
        int t[200];
     
        for(int i=1;i<1024;i++){
                                WSADATA var_init;
                                WSAStartup(MAKEWORD(2,2),&var_init);
     
     
     
                               SOCKET sock;
                               sock=socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
     
     
     
                               sockaddr_in connection;
                               connection.sin_family=AF_INET;
                               connection.sin_addr.s_addr=INADDR_ANY;
     
     
                               connection.sin_port=htonl(i);
                               flag=bind(sock,(SOCKADDR*) &connection,sizeof(connection));
                               cout<<i<<"   "<<flag<<"   "<<GetLastError()<<endl;
                               if(flag==WSAEADDRINUSE){
                                               t[j]=i;
                                               j++;
                                               }
                               closesocket(sock);
                               WSACleanup();
                               }   
     
        for(int i=0;i<j;i++){
                cout<<"le port : "<<t[j]<<" est occupé"<<endl;
                }
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    l'appel à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cout<<i<<"   "<<flag<<"   "<<GetLastError()<<endl;
    Me renvoie toujours:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    ...
    79   0   0
    80   0   0
    81   0   0
    82   0   0
    83   0   0
    84   0   0
    85   0   0
    86   0   0
    ...
    Pour tout les ports! Y compris le 80!
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  9. #9
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Citation Envoyé par b4u
    Essaye en inserant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    bool set = false;
    setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (const char*)&set, sizeof(set));
    entre tes appels a socket() et bind() pour voir si change qqchse?
    Non,ça ne change rien!

    Merci quand même!
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  10. #10
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    flag=bind(sock,(SOCKADDR*) &connection,sizeof(connection));
                               cout<<i<<"   "<<flag<<"   "<<GetLastError()<<endl;
    C'est là qu'est l'os:
    bind() renvoit SOCKET_ERROR en cas d'échec, et il faut comparer la valeur de WSAGetLastError() à WSAEADDRINUSE...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Merci, mais ça ne change rien: SOCKET_ERROR vaut -1 et flag me renvoie toujours 0.

    De plus WSAEADDRINUSE vaut 10048, c'est la bonne erreur, mais là aussi pour lui l'erreur est toujours 0 c'est à dire "tout est OK",ce qui n'est évidemment pas le cas.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  12. #12
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Poste ton nouveau code, s'il te plait...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  13. #13
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    C'est le même avec la modification de la condition de détection d'un port non ouvert ou indisponible:
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  14. #14
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Le probleme semble être au niveau de la fonction "bind" qui ne renvoie aucune erreur alors qu'elle tente de connecter le "serveur" sur un port occupé par un autre serveur: le 80 avec Apache!
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  15. #15
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Merci pour tout vos conseils!

    Je crois que c'est bon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(flag=bind(sock,(SOCKADDR*) &connection,sizeof(connection))==SOCKET_ERROR)
    Ca me renvoie 3 ports!
    Et ce sont précisément des ports auxquels je ne peux pas non plus accéder avec mon autre programme témoin, celui ou il faut rentrer le port auquel on se connecte.

    Malgré tout pourriez vous m'éclairer sur ce problème étrange?

    Je ne met pas encore le tag .

    J'attend vos explications avec impatience!

    Merci d'avance!
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  16. #16
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Bon! Pas de nouvelles réponses???


    Je met le tag
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

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

Discussions similaires

  1. [Débutant] voir les documents ouverts dans la session précédente
    Par Golzinne dans le forum Visual Studio
    Réponses: 0
    Dernier message: 15/01/2013, 09h44
  2. caché les ports ouvertes pour un serveur unix
    Par rezguiinfo dans le forum Sécurité
    Réponses: 0
    Dernier message: 18/12/2012, 17h40
  3. Les ports ouvertes par défaut
    Par a.elbaki dans le forum Hardware
    Réponses: 2
    Dernier message: 28/10/2010, 10h24
  4. Scanner les ports ouverts
    Par bilred dans le forum Développement
    Réponses: 4
    Dernier message: 10/10/2008, 10h21
  5. Comment lister les ports ouverts ?
    Par Shredder dans le forum Delphi
    Réponses: 10
    Dernier message: 16/07/2007, 12h17

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