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

Réseau C Discussion :

problèmes avec les sockets


Sujet :

Réseau C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 25
    Points : 7
    Points
    7
    Par défaut problèmes avec les sockets
    Bonjour à tous !!!!!!!!!!

    Voila , j'ai décidé d'apprendre à utiliser les sockets et pour m'entraîner , je veux faire deux programmes (un client et un serveur) qui s'envoi chacun un "hello" qui s'affiche à l'écran . Mais j'ai quelques soucis : rien ne s'affiche.
    Pourriez-vous me dire pourquoi ?



    Voici le client:

    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
    49
    50
    51
    52
    53
    54
    #include <stdio.h>
    #include <stdlib.h>
    #include <winsock2.h>
    #pragma comment(lib, "ws2_32.lib")
     
     
     
    int main(int argc, char *argv[])
    {char buff[255] ={0};
      char canal[50] = "hello" ;
     
     
       WSADATA wsadata;
       WSAStartup(MAKEWORD(2,0),&wsadata);
     
     
    SOCKET sock;
     
    sock = socket(AF_INET,SOCK_STREAM,0);
     
    SOCKADDR_IN sin;
    sin.sin_addr.s_addr = inet_addr("127.0.0.1");
    sin.sin_family = AF_INET;
    sin.sin_port = htons(2007);
     
    bind(sock,(SOCKADDR*)&sin,sizeof(sin));
     
    connect (sock, (SOCKADDR *)&sin, sizeof(sin));  
     
     
     
     
    bind(sock,(SOCKADDR*)&sin,sizeof(sin));
     
    listen(sock,10) ;
     
     
    send (sock,canal,50,0);
     
     
     
    recv (sock,buff,sizeof(buff),0);
     
     
    printf("%s\n\n\n",buff);
     
     
    closesocket(sock);
    WSACleanup();
     
     
      system("PAUSE");	
      return 0;
    }

    Et maintenant le serveur :



    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    #include <stdio.h>
    #include <stdlib.h>
    #include <winsock2.h>
    #pragma comment(lib, "ws2_32.lib")
     
     
     
    int main(int argc, char *argv[])
    {char buff[255] ={0};
        int i = 0;
     
     
     
     
        WSADATA wsadata;
        WSAStartup(MAKEWORD(2,0),&wsadata);
     
        SOCKET sock;
        SOCKET client;
        sock = socket(AF_INET,SOCK_STREAM,0);
     
        SOCKADDR_IN sin;
        SOCKADDR_IN client_sin;
        sin.sin_addr.s_addr  = INADDR_ANY;
        sin.sin_family = AF_INET;
        sin.sin_port = htons(2007);
     
        bind(sock,(SOCKADDR*)&sin,0);
        bind(client,(SOCKADDR*)&client_sin,0);
     
        listen(sock,10);
     
        printf("\n\tServeur en route\n");
     
        int sinsize = sizeof(sin);
     
     
     
     
       while(1)
    	{
        client = accept(sock,(SOCKADDR*)&client_sin,&sinsize);
     
     
        recv(client, buff, 255,0);
        printf("%s",buff);
     
     
     
        send(client,"hello",6,0);
     
       } 
     
      closesocket(sock);
    WSACleanup();
     
      system("PAUSE");	
      return 0;
    }

    Voila , j'espère que vous pourrez m'aider , merci d'avance à tous.

  2. #2
    Membre éclairé Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Points : 844
    Points
    844
    Par défaut
    Met des printf() un peu partout dans le client et le serveur pour savoir si tout le code est exécuté.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 25
    Points : 7
    Points
    7
    Par défaut
    En fait , j'ai vérifié que le code était exécuté en entier , par contre il y a un autre truc qui est bizard :

    quand je vérifie les fonctions accepte , listen et bind avec la valeur SOCKET_ERROR en faisant un "if" et un printf ,

    que je mette :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (accept(sock,(SOCKADDR*)&client_sin,&sinsize) == SOCKET_ERROR)
    {
    printf ("erreur de liaison socket");
     
    }

    ou que je mette :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (accept(sock,(SOCKADDR*)&client_sin,&sinsize) != SOCKET_ERROR)
    {
    printf ("laison de socket : ok");
    }

    le message s'affiche !!!!!!!!!!!!!!!!!!!!

    (j'ai DEV C++ et j'ai mis "-lwsock32" dans le linker)

    Est-ce normal ????????

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 28
    Points : 20
    Points
    20
    Par défaut
    salut,

    t'es sur que t'as compris comment sa marche ?

    j'ai pas tout lu ton code mais pour un serveur, il suffit d'un bind, et pour un client , pas besoin.

    voici (en pseudo code) la marche a suivre pour le client:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    demarrage de WSA;
    creation de la socket;
    connection au serveur;
    envoie ou reception du serveur;
    extinction de wsa et des socket;
    et pour le serveur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    demarrage de wsa;
    creation de la socket;
    bindage de la socket;
    ecoute du port;
    acceptation des socket entrante;
    reception ou envoie du message;
    extinction de wsa et des socket;
    pour le client en vrai code maintenant:
    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
     
    /* tout mettre dans la main, code tres minimaliste: pas de verif' en cas d'echec de création de socket ou de demarage de wssa foireux*/
    WSADATA initialisation_win32;
    WSAStartup(MAKEWORD(2,2),&initialisation_win32);
     
    //creation de la socket
    SOCKET socket_perso = socket(AF_INET, SOCK_STREAM, 0);
    SOCKADDR_IN info_source;
                info_source.sin_family = AF_INET;
                info_source.sin_addr.s_addr = inet_addr(127.0.0.1);
                info_source.sin_port = htons(3000);
     
    //puis connection
    connect(socket, (struct sockaddr*)info_source, sizeof(*info_source));
     
    //envoi
    char message[] = "hello";
    send(socket, message, strlen(message), 0);
     
    //et enfin on arrete tout
    shutdown(socket_perso, 2);
    closesocket(socket_perso);
    WSACleanup();

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 25
    Points : 7
    Points
    7
    Par défaut
    Ben en fait au niveau compréention , c'est moyen (j'ai regardé quelqes tutos sur le net) .
    J'aimerais savoir ? on est pas obligé de fére une boucle au send du serveur ?????????????????
    Et aussi , je n'ai pas très bien compri la fonction bind ni pourkoi on n'est pas obligé de la mettre au client , si tu pouvait m'en dire plus ... merci

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 25
    Points : 7
    Points
    7
    Par défaut
    ça n'affiche toujours pas les "hello" .... Ni sur le serveur , ni sur le client...

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 28
    Points : 20
    Points
    20
    Par défaut
    ok! bon voila:

    le serveur est une machine qui va attendre que les client se connecte et traiter leurs données.
    par exemple quand tu te connecte sur un site tu te connecte au serveur: tu es donc le client.

    or pour que la machine (qui, soit dit au passage, est completemnt idiote) puisse repondre, il faut qu'elle trouve le client. pour cela, tu lui di d'attendre et d'ecouter si il y a qq'un ( c'est la fonction listen).
    mais voila: lamachine ne sait pas ou ecouter, tu doit lui dire. pour cela il faut lui donner plusieurs info: le port a ecouter, la famille de la socket client...
    c'est la que sert le bind().
    donc tu fait un bind pour assiger un port a ta socket(le port qu'elle va ecouter) puis un listen (afin de trouver tes client) que tu met dans une boucle car la fonction n'est pas bloquante. enfin tu met un accept pour accepter les client. l'accept te donne une socket nouvelle: celle de ce client. c'est sur celle la que tu devra faire tes send.

    ensuite le client:

    lui il n'a pas a ecouter, il va se connecter de lui meme au serveur. donc pas de bind ni de listen mais un connect.
    une fois la connection etablie, tu peux faire de send et des recv tant que tu veux.
    donc pour le client, tu fait
    • socket();
    • connect();
    • send(); ou recv();


    en esperant t'avoir aider.

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 25
    Points : 7
    Points
    7
    Par défaut
    Merci beaucoup . haaa , enfin une expliquation claire , simple et rapide .
    Juste un dernier petit truc : faut il faire une boucle au moment de l'envoi d'un message car l'application serveur va s'executer et n'attendra pas que j'execute le client pour envoyer le message . merci

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 28
    Points : 20
    Points
    20
    Par défaut
    c'est pour sa qu'en theorie c'est le serveur qui attend et le client qui envoie.

    sur ton serveur tu fait un recv(); qui est bloquante, et sur le client tu envoie (send().
    une fois que t'as reçu, ton recv est debloquer, là tu envoie depuis le serveur sur le client.

    bien sur, il faut lancer le serveur avant le client.

    apres si tu veux envoyer plusieurs message, là il te faut des boucles.

    c'est toujours un plaisirs d'aider qq'un qui y met de la bonne volontée.

    salut
    hedi07

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 25
    Points : 7
    Points
    7
    Par défaut
    merci beaucoup , bon , je pense qu'il est temps que je me débrouille tout seul , c'est ça la programmation : faut de la volonté .....

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 28
    Points : 20
    Points
    20
    Par défaut
    de la volonté et de la patience ouais.

    si t'as d'autre question, n'hesite pas.

    hedi07

  12. #12
    Membre éclairé Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Points : 844
    Points
    844
    Par défaut
    L'appel à la fonction accept() à lieu dans une boucle while(1).
    Donc il est tout à fait possible que une fois l'accept passe, et l'autre fois il ne passe plus. Donc compréhensible que tu ais un message d'erreur qui s'affiche à chaque fois. Par contre je ne dis pas que cela ne soit pas révélateur d'un problème plus sévère.

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 25
    Points : 7
    Points
    7
    Par défaut
    haaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa !!!!!!!!!!!
    Zuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuttttttttttttttttttt !!!!!!!!!!!!!!!

    ça marche po ........

    j'ai bo essayer...


    je sais que c'est trop demander mais serait-il possible que vous postiez le code d'un serveur s'il-vous -plait , histoire que je vois à quoi ça ressemble ...

  14. #14
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par lukbutor
    Merci beaucoup . haaa , enfin une expliquation claire , simple et rapide .

    Sauf qu'elle est fausse..


    ça commence dès le début :

    Citation Envoyé par hedi07
    le serveur est une machine
    ARCHI-FAUX...

    Ne confondons pas une MACHINE reliées à d'autres, sur laquelle on dépose par exemple un fichier qui sera accédé depuis plusieurs autres machines, et qu'on appelle en raccourci SERVEUR, mais qui en fait est une MACHINE SERVEUR, et un PROGRAMME, qui attend des requêtes d'autres programmes et y répond via un certain protocole, qu'on appelle aussi un SERVEUR.

    Dans le cadre d'une architecture CLIENT-SERVEUR, on s'occupe en général des PROGRAMMES (ce qui est le cas du PO).

    ça continue :

    Citation Envoyé par hedi07
    or pour que la machine (qui, soit dit au passage, est completemnt idiote)
    1) c'est pas une machine, et 2) elle est pas complètement idiote, pusiqu'elle va faire tout le traitement...


    Citation Envoyé par hedi07
    la machine ne sait pas ou ecouter
    Pas plus que n'importe quel programme dans lequel tu ne mets aucune instruction...

    Il faut juste l'instruction et les paramètres correspondants à l'action que tu veux faire. C'est comme la fonction fprintf : si je suis ton raisonnement, elle est idiote car elle ne sait pas où écrire. Ben non, elle est PREVUE pour pouvoir écrire à plusieurs endroits quelconques. De la même manière, listen est PREVUE pour écouter sur divers ports, et il faut donc lui signaler lequel on veut écouter.

    Citation Envoyé par hedi07
    l'accept te donne une socket nouvelle: celle de ce client. c'est sur celle la que tu devra faire tes send.
    OUI mais le principe n'est pas celui-là..

    listen écoute des DEMANDES de service. Quand il les reçoit, il CREE UNE CONNEXION séparée pour discuter. C'est pour ça que le client ne fera pas de listen, alors que le serveur retourne attendre une DEMANDE DE SERVICE, et l'accept à créé une COPIE du serveur, qui elle n'écoute QUE la connexion créée.


    C'est comme quand tu es dans une banque ou à la Sécu :

    tu fais la queue avec ton ticket, il y a un écran qui affiche les numéros qu'on appelle.

    Le serveur, c'est le "dispatcher" des numéros : tu as pris ton ticket, c'est donc que tu veux dialoguer avec quelqu'un (le client demande un service). Le "dispatcher" t'envoie vers un guichet libre (le serveur créé une copie de lui-même dédièe au dialogue avec CE client). Puis il se retourne vers la file de clients en attente pour voir qui passera ensuite, pour le diriger ves un nouveau guiche libre..

  15. #15
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 25
    Points : 7
    Points
    7
    Par défaut
    houlala , je ne sait plus que croire .....
    Mais ça na répond pas à ma question : comment faire dans un cas comme le mien????????????????????????????????????????????????????,,,,,,

  16. #16
    Membre éclairé Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Points : 844
    Points
    844
    Par défaut
    Déjà en lisant rapidement ton code source, tu as un problème dans la boucle while de ton serveur.

    En effet, les sockets "client" issues de l'accept ne sont jamais fermées. Si j'était toi je rajouterais un "closesocket()".

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 28
    Points : 20
    Points
    20
    Par défaut
    hedi07 a écrit :
    le serveur est une machine
    effectivement ce n'est pas tout a fait vrai, le programme serveur (dont on parlait) est un programme.
    cependant il va utiliser une machine, donc j'ai tout mis dans le même bloc (en effet j'ai dit plus tard que le client allait s'y connecter, or il ne se connecte pas au programme, mais a la machine(identifier par son ip) en passant par des port matériel. le programme traitera ensuite la connection.)
    mais qu'aurait il fallu dire: le serveur est l'ensemble programme-machine ?

    hedi07 a écrit :
    or pour que la machine (qui, soit dit au passage, est complètement idiote)
    la machine est complètement idiote au sens ou elle ne fait rien seul, il faut tout lui dire.(n'entrons pas dans ce débat ici, ce n'est pas le sujet)

    ensuite:
    hedi07 a écrit :
    la machine ne sait pas ou écouter
    Pas plus que n'importe quel programme dans lequel tu ne mets aucune instruction...
    si t'avais lu ma phrase jusqu'au bout t'aurai vu que c'est ce que j'ai dit.
    pour être précis j'ai dit: la machine ne sait pas ou écouter, tu doit lui dire.(j'espere quand même que lukbutor a compris que par "dire" j'entendais mettre des instructions (eh! lukbutor, t'es pas allé chuchoter les instruction a la machine, hein? ))

    j'admets tout a fait que je peux me tromper mais de la a ce que mon explication soit archi-fausse...

    salut
    hedi07

  18. #18
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par lukbutor
    Voila , j'ai décidé d'apprendre à utiliser les sockets et pour m'entraîner , je veux faire deux programmes (un client et un serveur) qui s'envoi chacun un "hello" qui s'affiche à l'écran . Mais j'ai quelques soucis : rien ne s'affiche.
    Pourriez-vous me dire pourquoi ?
    En attendant que j'ai récupéré mon environnement de développement et que je puisse tester ton code, je t'invite à lire ceci :

    http://emmanuel-delahaye.developpez.com/reseaux.htm

  19. #19
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 25
    Points : 7
    Points
    7
    Par défaut
    Tout d'abord , merci à tous pour vos réponses , mais cela fais maintenant 3 jours que je cherche en vaint ...
    Merci Emmanuel Delahaye ,mais j'avais déjà lus ces notes (très interressantes mais un peu compliquées). Je vais attendre que tu testes mon code en continuant à chercher des info . Ce serais bien si il y avait un tuto clair précis et surtout avec des codes vérifié sur les sockets

  20. #20
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 28
    Points : 20
    Points
    20

Discussions similaires

  1. [OCaml] Petit problème avec les sockets
    Par Fractal LLG dans le forum Caml
    Réponses: 3
    Dernier message: 28/02/2008, 12h18
  2. un serieux problème avec les sockets
    Par dc.sara dans le forum Réseau
    Réponses: 4
    Dernier message: 23/01/2008, 16h11
  3. Problème avec les sockets
    Par projeticq dans le forum Réseau
    Réponses: 14
    Dernier message: 19/04/2007, 09h32
  4. Problème avec les sockets et la fonction accept
    Par projeticq dans le forum Réseau
    Réponses: 6
    Dernier message: 13/04/2007, 11h37
  5. [Win32] Problème avec les sockets
    Par mickael777 dans le forum MFC
    Réponses: 3
    Dernier message: 12/08/2005, 11h15

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