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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 25
    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 émérite 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
    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
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 25
    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 averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 28
    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
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 25
    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
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 28
    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
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 25
    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
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25
    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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 28

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par lukbutor
    Ce serais bien si il y avait un tuto clair précis et surtout avec des codes vérifié sur les sockets
    A la fin de mon article, il y a des références. Tu les as lues ?

    http://vidalcharles.free.fr/lf/socket.html

    mais si tu trouves mon article compliqué...

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25
    Par défaut
    je viens de parcourir rapidement le tutoriel de ton lien Emmanuel Delahaye et il m'a l'air très complet , merci beaucoup , j'espère que ça va m'aider .

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25
    Par défaut
    reeeeeeeeeeeeeeeeeeeeeeeee

    Excusez-moi de vous redéranger mais j'ai un nouveau problème :

    mon compilateur (DEV C++) ne reconnais pas la fonction fork();:


    link error

    comment puis-remédier à ce problème??????

    merci d'avance à tous !!!!!!!!!!!

  15. #15
    Membre émérite
    Avatar de Freed0
    Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    635
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 635
    Par défaut
    Salut

    Je n'ai pas lu les autres réponses du sujet, mais je vais tenter de t'aider un peu Pour mes remarques => voir commentaires dans le code ci-dessous.

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <winsock2.h>
    #pragma comment(lib, "ws2_32.lib")
     
    int main(int argc, char *argv[])
    {
        /* Je te conseille de mettre toutes tes déclarations en début de fichier,
        ce sera beaucoup plus compréhensible ;) */
        char buff[255] = {0};
        /* Les communications réseau utilisent les caractères \r\n pour marquer
        une fin de ligne. Si tu définis directement le contenu de ta chaine de
        caractères, pas besoin du [50], le compilateur s'en occupera... */
        char canal[] = "hello\r\n" ;
     
        WSADATA wsadata;
        SOCKET sock;
        SOCKADDR_IN sin;
     
        /* Utilises plutôt la version 2,2 ;) */
        WSAStartup(MAKEWORD(2,2),&wsadata);
     
        sock = socket(AF_INET, SOCK_STREAM, 0);
     
        sin.sin_addr.s_addr = inet_addr("127.0.0.1");
        sin.sin_family = AF_INET;
        sin.sin_port = htons(2007);
     
        /* Le client n'a pas besoin de bind ni de listen, il a juste besoin de
        socket() et de connect()
        bind(sock, (SOCKADDR*)&sin, sizeof(sin));
        */
     
        connect(sock, (SOCKADDR *)&sin, sizeof(sin));  
     
        /* Même remarque
        bind(sock, (SOCKADDR*)&sin, sizeof(sin));
        listen(sock, 10);
        */
     
        /* Ca fonctionnera mais je te conseille tout de même de controler
        l'envoi de données ;) */
        send(sock, canal, strlen(canal) + 1, 0);
     
        /* Pareil */
        recv (sock, buff, sizeof(buff), 0);
     
        printf("%s\n\n\n", buff);
     
        closesocket(sock);
        WSACleanup();
     
        system("PAUSE");	
        return 0;
    }
    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;
     
        SOCKET sock;
        SOCKET client;
        SOCKADDR_IN sin;
        SOCKADDR_IN client_sin;
     
        int sinsize = sizeof(sin);
     
        WSAStartup(MAKEWORD(2,2), &wsadata);
     
        sock = socket(AF_INET, SOCK_STREAM, 0);
     
        /* Il est possible que ça fonctionne sans htonl, mais je te conseille
        de le mettre */
        sin.sin_addr.s_addr  = htonl(INADDR_ANY);
        sin.sin_family = AF_INET;
        sin.sin_port = htons(2007);
     
        /* Un seul bind suffit, pq binder un socket qui n'existe même pas ?
        De toute façon il ne faut pas le binder */
        bind(sock, (SOCKADDR*)&sin, 0);
        /*
        bind(client,(SOCKADDR*)&client_sin,0);
        */
     
        listen(sock, 10);
     
        printf("\n\tServeur en route\n");
     
        while(1)
        {
            client = accept(sock, (SOCKADDR*)&client_sin, &sinsize);
     
            recv(client, buff, sizeof(buff), 0);
     
            printf("%s", buff);
     
            /* Je te déconseille d'envoyer des chaines de cette façon... Utilise
            plutot une variable qui contient le message à envoyer ;) */
            send(client, "hello\r\n", 8, 0);
        } 
     
        closesocket(sock);
        WSACleanup();
     
        system("PAUSE");	
        return 0;
    }
    J'ai peut être loupé quelques autres erreurs. Bref, ton programme actuel est incomplet (il manque notamment les controles sur les fonctions utilisées, etc...) mais il devrait fonctionner et t'aider à t'y retrouver dans les sockets

    Bonne chance

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