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

Développement Discussion :

sockets


Sujet :

Développement

  1. #1
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 943
    Points
    5 943
    Par défaut sockets
    Salut à tous,
    je voudrais faire un programme qui me dise si un port X est ouvert sur mon poste local (expl avec X=23). Faut-il que j'utilise les sockets (je n'ai encore jamais abordé cette partie) et si oui pouvez-vous m'aiguiller un peu.
    D'après ce que j'ai cherché ça donne en gros :
    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
    
    #include <winsock.h>
    #include <errno.h>
    #include <stdlib.h>
    #include <stdio.h>
    
    int main&#40;int argc, char **argv&#41;
    &#123;
        
    WSADATA WSAData;
    WSAStartup&#40;MAKEWORD&#40;1,0&#41;, &WSAData&#41;;
    
    SOCKET sock;
    SOCKADDR_IN sin;
    
    if  &#40;  &#40;sock = socket&#40;AF_INET , SOCK_STREAM , 0 &#41;&#41; < 0 &#41; 
    &#123;
        perror&#40;"socket"&#41;; 
        system&#40;"PAUSE"&#41;;	
        return 1; 
    &#125; 
    
    memset&#40;&sin , 0 , sizeof&#40;sin&#41;&#41;;
    sin.sin_addr.s_addr	= inet_addr&#40;"127.0.0.1"&#41;;
    sin.sin_family		= AF_INET;
    sin.sin_port		= htons&#40;23&#41;;
    
    if &#40; bind&#40;sock, &#40;SOCKADDR *&#41;&sin , sizeof&#40;sin&#41;&#41; < 0 &#41;
    &#123;
        perror&#40;"bind"&#41;; 
        system&#40;"PAUSE"&#41;;	
        return 1; 
    &#125; 
    
    if&#40;connect&#40;sock, &#40;SOCKADDR *&#41;&sin, sizeof&#40;sin&#41;&#41;<0&#41;
    &#123;
        perror&#40;"connect"&#41;;
    &#125;
    
      system&#40;"PAUSE"&#41;;	
      closesocket&#40;sock&#41;;
      WSACleanup&#40;&#41;;
      return 0;
    &#125;
    avec ce code, connect() renvoie une erreur et perror("connect") affiche "No error".
    Comme je l'ai dit, je connait rien aux sockets alors
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  2. #2
    Membre éprouvé
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Points : 1 166
    Points
    1 166
    Par défaut
    Salut

    Il existe un forum "Developpement reseaux" plus approprié à ta question.
    Mais si connect() échoue, c'est que la connexion n'a pas pu avoir lieu donc que le port est peut-etre fermé.
    Quand t'envoie une requête vers une machine (serveur), t'envoie un 'signal' avec SYN=1. Quand l'hote de répond, tu récupères un packet ACK=1 (acquittement) et ensuite, tu peux commencer à discuter grâce aux fonctions recv(),send(),etc. Donc en gros, si connect() échoue, c'est que la machine n'a pas pu atteindre la cible (port fermé ? ).
    Essaye sur un autre port (le 23 étant celui utilisé par telnet).
    Il y a des scanners open-source comme Nmap, tu peux t'en inspirer.

    Nas'

  3. #3
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 943
    Points
    5 943
    Par défaut
    j'ai dit que j'abordais le sujet, alors les sources de nmap et autres

    Quand je change de port ça fait pareil.
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    554
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 554
    Points : 181
    Points
    181
    Par défaut
    Pourquoi utilise-tu la librairie winsock.h alors qu'il y en a une nouvelle winsock2.h qui devrait régler tes problèmes je pense.
    Va là http://c.developpez.com/WalrusSock/, tu devrais tout trouver.
    Sinon j'ai pu voir que tu utilisé la fonction system() pour voir ce qui se passe avant que le programme se finisse, moi je te conseillerais de les supprimer parce-que il ne faut pas trop les utiliser et si tu veux voir ce qu'il se passe, démarre une nouvelle fenêtre Dos et démarre ton programme à l'aide des commandes. Ainsi, quand ton programme se terminera, la fenêtre ne se fermera pas et tu pourra voir ce qui s'est passé.

    A+

  5. #5
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 943
    Points
    5 943
    Par défaut
    Merci pour le lien, c'est plutôt bien expliqué.
    J'ai utilisé winsock2 mais j'ai toujours le même probleme.
    en fait ce qui m'em(bête?) c'est que connect() renvoie une erreur mais errno=<null> donc impossible de savoir pourquoi la connection a échoué (et c'est ce qui m'interesse) ; est-ce que j'ai oublié quelquechose pour errno ?
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  6. #6
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Je vais peut être dire une bêtise, mais après un bind pour moi il faut un listen.

    Si tu veux tester qu'il est ouvert il faut faire un connect tout cours...
    Si tu veux te placer en service telnet fait un bind et un listen.

  7. #7
    Membre éprouvé
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Points : 1 166
    Points
    1 166
    Par défaut
    Le listen() c'est pour le serveur qui attend une connexion.
    Là, il fait un client il me semble.
    N'as-tu pas un firewall qui bloque les connexions ? Essaye de te connecter sur un autre endroit (par exemple google) sur le port 80.

    Nas'

  8. #8
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 943
    Points
    5 943
    Par défaut
    dès que je met une adresse IP différente de la mienne c'est le bind qui echoue et là aussi errno=<null>.
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  9. #9
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Citation Envoyé par Ti-R
    Je vais peut être dire une bêtise, mais après un bind pour moi il faut un listen.

    Si tu veux tester qu'il est ouvert il faut faire un connect tout cours...
    Si tu veux te placer en service telnet fait un bind et un listen.
    http://c.developpez.com/WalrusSock/


    relit le tout

  10. #10
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 943
    Points
    5 943
    Par défaut
    J'ai étudier le lien que tu ma donné et je croyais que le bind était "obligatoire", en tout état de cause meme en le levant (connect tout cours) ça ne change rien.
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  11. #11
    Membre actif
    Profil pro
    Ingénieur développement
    Inscrit en
    Juillet 2004
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement

    Informations forums :
    Inscription : Juillet 2004
    Messages : 323
    Points : 291
    Points
    291
    Par défaut
    Sous un UNIX quelconque :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    netstat -a | grep LISTEN
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sudo lsof -i tcp | grep LISTEN
    Хајде Јано коло да играмо

  12. #12
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Essaye ceci....

    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
    connect_to.sin_family = AF_INET;					// TCP socket
    connect_to.sin_port = htons&#40;23&#41;;
    connect_to.sin_addr.s_addr = inet_addr&#40;"127.0.0.1"&#41;;
    connected_socket = socket&#40;AF_INET, socket_type,0&#41;;			// create socket
    
    ioctl_opt=1;								// Must be >0 to pass in non block mode.
    ioctlsocket&#40;connected_socket,FIONBIO,&ioctl_opt&#41;;
    
    if&#40;connected_socket >=0&#41;											// ErrorWSACClient_RiTe&#40;"Error Opening socket&#58; "&#41;;
    &#123;
    	connect&#40;connected_socket,&#40;struct sockaddr*&#41;&connect_to,sizeof&#40;connect_to&#41;&#41;;
    
    	fd_set wrset;
    	fd_set exset;
    	FD_ZERO&#40;&wrset&#41;;
    	FD_ZERO&#40;&exset&#41;;
    
    	FD_SET&#40;connected_socket, &wrset&#41;;
    	FD_SET&#40;connected_socket, &exset&#41;;
    	timeval time_socket;
    	time_socket.tv_sec=0;
    	time_socket.tv_usec=10000;
    
    	//wait until connect finishes
    	int result = select&#40;0, 0, &wrset, &exset, &time_socket&#41;;
    
    	if&#40;result==SOCKET_ERROR&#41;
    		//error
    	else
    	&#123;
    		if&#40;result!=0 && wrset.fd_count>0&#41;
    		&#123;
    			//success
    		&#125;
    	&#125;
    	closesocket&#40;connected_socket&#41;;
    &#125;
    Je ne l'ai pas compilé, c'est un extrait de ce que j'ai fait, il est à compléter bien entendu !

  13. #13
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 943
    Points
    5 943
    Par défaut
    Peut-tu me dire quel sont les include ?
    et aussi quelques commentaires par expl ça sert à quoi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    fd_set wrset; 
       fd_set exset; 
       FD_ZERO&#40;&wrset&#41;; 
       FD_ZERO&#40;&exset&#41;; 
    
       FD_SET&#40;connected_socket, &wrset&#41;; 
       FD_SET&#40;connected_socket, &exset&#41;; 
       timeval time_socket; 
       time_socket.tv_sec=0; 
       time_socket.tv_usec=10000;
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  14. #14
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Cela permet de gérer une liste de sockets !
    fd_set est la liste !

    Ensuite on test si un message est arrivé en écriture/lecture

    Permet de gérer le temps d'attente avant que le code ne continue

Discussions similaires

  1. executer une application a distance : Sockets ? RPC ? CORBA?
    Par a_hic dans le forum Développement
    Réponses: 5
    Dernier message: 30/05/2006, 13h02
  2. raw socket et langage c
    Par SlayDave dans le forum Développement
    Réponses: 2
    Dernier message: 29/08/2002, 19h09
  3. socket
    Par ben91 dans le forum Développement
    Réponses: 5
    Dernier message: 13/08/2002, 11h04
  4. Socket:Envoyer du texte d'un serveur vers tout les clients
    Par cedm78 dans le forum Web & réseau
    Réponses: 7
    Dernier message: 01/08/2002, 16h40
  5. transfert d'un fichier bitmap en socket tcp
    Par localhost dans le forum C++Builder
    Réponses: 5
    Dernier message: 29/07/2002, 00h40

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