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 :

Probleme de socket


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 : 38
    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
    Par défaut Probleme de socket
    Salut!

    Je viens de me mettre aux sockets et je galere!

    J'ai vu quelques tutos (notamment celui de The Walrus) et j'essaye cette application:

    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
    #include <cstdlib>
    #include <iostream>
    #include <winsock2.h>
     
    using namespace std;
     
    int main(int argc, char *argv[])
    {
        char buffer[255];
     
    	WSADATA WSAData;
    	WSAStartup(MAKEWORD(2,0), &WSAData);
     
    	SOCKET sock;
    	SOCKET csock;
    	SOCKADDR_IN sin;
    	SOCKADDR_IN csin;
     
    	sock = socket(AF_INET, SOCK_STREAM, 0);
     
    	sin.sin_addr.s_addr = INADDR_ANY;
    	sin.sin_family	    = AF_INET;
    	sin.sin_port	    = htons(4444);
     
    	bind(sock, (SOCKADDR *)&sin, sizeof(sin));
    	listen(sock, 0);
     
    	while(1)
    	{
    	   int sinsize = sizeof(csin);
    	   if((csock = accept(sock, (SOCKADDR *)&csin, &sinsize)) != INVALID_SOCKET)
    	   {
          		 memset(buffer,0,255);
    	         wsprintf(buffer,"Bienvenu sur mon serveur ;)");
    	         send(csock,buffer,255,0);
    	   }
    	}
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <winsock2.h>
    #include <conio.h>
     
    int main()
    {
    WSADATA WSAData;
    	WSAStartup(MAKEWORD(2,0), &WSAData);
     
    	SOCKET sock;
    	SOCKADDR_IN sin;
    	char buffer[255];
     
    	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(4444);
     
    	connect(sock, (SOCKADDR *)&sin, sizeof(sin));
       	memset(buffer,0,255);
    	recv(sock, buffer, sizeof(buffer), 0);
       	printf("%s",buffer);
       	getch();
    	closesocket(sock);
    	WSACleanup();
    system("pause");
    return EXIT_SUCCESS;
    }
    Ca compille sans probleme mais a l'execution, je lance d'abord le serveur puis le client, la fenetre client ne recoit pas de message!

    Merci pour toute vos contribution et encore toutes mes excuses pour poser des questions trés basiques!

    PS:J'utilise Dev-Cpp

  2. #2
    Rédacteur

    Avatar de khayyam90
    Homme Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2004
    Messages
    10 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 371
    Par défaut
    bien le bonjour,

    j'ai compilé et exécuté ton code, et chez moi ça marche correctement. Teste le retour des fonctions bind, accept, socket... pour voir si tout se passe bien.

  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 : 38
    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
    Par défaut
    Merci encore de m'aider!

    Bind renvoit 0
    Accept renvoit 4294967295
    Socket renvoit 108

  4. #4
    Rédacteur

    Avatar de khayyam90
    Homme Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2004
    Messages
    10 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 371
    Par défaut
    le retour de accept n'est pas correct.
    Fais un affichage de WSAGetLastError() après le accept. Tu peux aussi faire un affichage de WSAGetLastError() après le send. Tu obtiendras des numéros d'erreur.
    La liste des erreurs de la winsock : ici

  5. #5
    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 : 38
    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
    Par défaut
    accept renvoie une erreur 10022.

    A l'adresse indiquée j'ai vu que cela pouvait venir d'une demande sur un socket qui n'est pas en écoute ce qui n'est pas le cas.

    Je voie pas trop le probleme.

    Je vais pousser mes recherches plus loin...sans grand espoir.

    Encore merci!

  6. #6
    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
    2-3 conseils :

    1/ le premier argument de socket c'est PF_INET et non AF_INET...
    AF = Address Family (utilisé par sockaddr_in)
    PF = Protocol Family (utilisé par socket)

    2/ Utilises MAKEWORD(2, 2).

    3/ Pour le serveur, utilises htonl(INADDR_ANY) au lieu de INADDR_ANY.

  7. #7
    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 : 38
    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
    Par défaut
    J'ai refait le programme en suivant les conseils de Freed0, mais j'ai toujours le meme probleme.
    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
    #include <cstdlib>
    #include <iostream>
    #include <winsock2.h>
     
    using namespace std;
     
    int main(int argc, char *argv[])
    {
        char buffer[255];
     
    	WSADATA WSAData;
    	WSAStartup(MAKEWORD(2,2), &WSAData);
     
    	SOCKET sock;
    	SOCKET csock;
    	SOCKADDR_IN sin;
    	SOCKADDR_IN csin;
     
    	sock = socket(PF_INET, SOCK_STREAM, 0);
     
    	sin.sin_addr.s_addr = htonl(INADDR_ANY);
    	sin.sin_family	    = AF_INET;
    	sin.sin_port	    = htons(4444);
     
     
    	listen(sock,0);
     
    	while(1)
    	{
    	   int sinsize = sizeof(csin);
    	   if((csock = accept(sock, (SOCKADDR *)&csin, &sinsize)) != INVALID_SOCKET)
    	   {
          		 memset(buffer,0,255);
    	         wsprintf(buffer,"Bienvenu sur mon serveur ;)");
    	         send(csock,buffer,255,0);
     
    	   }
    	}
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <winsock2.h>
    #include <conio.h>
    #include<iostream>
     
    using namespace std;
     
    int main()
    {
    WSADATA WSAData;
    	WSAStartup(MAKEWORD(2,2), &WSAData);
     
    	SOCKET sock;
    	SOCKADDR_IN sin;
    	char buffer[255];
     
    	sock = socket(PF_INET, SOCK_STREAM, 0);
     
     
    	sin.sin_addr.s_addr = inet_addr("127.0.0.1");
    	sin.sin_family	    = AF_INET;
    	sin.sin_port	    = htons(4444);
     
    	connect(sock, (SOCKADDR *)&sin, sizeof(sin));
       	memset(buffer,0,255);
    	recv(sock, buffer, sizeof(buffer), 0);
       	printf("%s",buffer);
       	getch();
    	closesocket(sock);
    	WSACleanup();
    system("pause");
    return EXIT_SUCCESS;
    }
    accept me renvoie toujours une erreur 10022

    Merci beaucoup pour toute ces précisions qui me permettent d'y voir plus clair dans le fonctionnement des sockets.

  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 : 38
    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
    Par défaut
    Sinon merci a khayyam90 pour la doc!

  9. #9
    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
    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 <cstdlib>
    #include <iostream>
    #include <winsock2.h>
     
    using namespace std;
     
    int main(int argc, char *argv[])
    {
        char buffer[255];
     
        WSADATA WSAData;
        WSAStartup(MAKEWORD(2,2), &WSAData);
     
        SOCKET sock;
        SOCKET csock;
        SOCKADDR_IN sin;
        SOCKADDR_IN csin;
     
        sock = socket(PF_INET, SOCK_STREAM, 0);
     
        sin.sin_addr.s_addr = htonl(INADDR_ANY);
        sin.sin_family	    = AF_INET;
        sin.sin_port	    = htons(4444);
     
        bind(sock, (SOCKADDR *)&sin, sizeof(sin));    
     
        listen(sock, 0);
     
        while(1)
        {
            int sinsize = sizeof(csin);
     
            csock = accept(sock, (SOCKADDR *)&csin, &sinsize);
     
            if((csock != INVALID_SOCKET)
            {
                memset(buffer, 0, 255);
                sprintf(buffer, "Bienvenue sur mon serveur ;)\r\n");
                send(csock, buffer, strlen(buffer), 0);
            }
        }
     
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <winsock2.h>
    #include <conio.h>
    #include <iostream>
     
    using namespace std;
     
    int main()
    {
        WSADATA WSAData;
        WSAStartup(MAKEWORD(2,2), &WSAData);
     
        SOCKET sock;
        SOCKADDR_IN sin;
        char buffer[255];
     
        sock = socket(PF_INET, SOCK_STREAM, 0);
     
        sin.sin_addr.s_addr = inet_addr("127.0.0.1");
        sin.sin_family	    = AF_INET;
        sin.sin_port	     = htons(4444);
     
        connect(sock, (SOCKADDR *)&sin, sizeof(sin));
        memset(buffer,0,255);
        recv(sock, buffer, sizeof(buffer), 0);
     
        printf("%s",buffer);
        getch();
     
        closesocket(sock);
        WSACleanup();
     
        system("pause");
        return EXIT_SUCCESS;
    }
    Et comme ça ?
    Faudra changer pas mal de chôse dans ton code une fois qu'il fonctionnera (traiter les données reçues, vérifier chaque valeur retournée, etc...)

  10. #10
    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 : 38
    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
    Par défaut
    Citation Envoyé par Freed0
    1/ le premier argument de socket c'est PF_INET et non AF_INET...
    AF = Address Family (utilisé par sockaddr_in)
    PF = Protocol Family (utilisé par socket)
    Euh...dans la doc ya bien ce que j'avais mis.

  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 : 38
    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
    Par défaut
    J'ai essayé le code donné par Freed0, merci beaucoup d'avoir pris le temps de le refaire, mais le client ne recoit toujours rien!

  12. #12
    Rédacteur

    Avatar de khayyam90
    Homme Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2004
    Messages
    10 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 371
    Par défaut
    et avec ?

    ça peut être ça si tu as
    • Microsoft Windows 2000 Service Pack 1
    • Microsoft Windows 2000 Advanced Server

  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 : 38
    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
    Par défaut
    Je suis sous Windows XP Edition familiale avec le SP2.

    Merci beaucoup de proposer des solutions!

    Je suis en train de me faire le tuto de A a Z sur le site MSDN donné par khayyam90.
    Je comprend mieux la multitude des étapes necessaires pour envoyer un pauvre message de 1 ligne!

    Je peut déjà vous dire que l'initialisation est correcte.

  14. #14
    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
    Citation Envoyé par seriousme
    Citation Envoyé par Freed0
    1/ le premier argument de socket c'est PF_INET et non AF_INET...
    AF = Address Family (utilisé par sockaddr_in)
    PF = Protocol Family (utilisé par socket)
    Euh...dans la doc ya bien ce que j'avais mis.
    http://dpobel.free.fr/man/html/html.2/socket.htm

  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 : 38
    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
    Par défaut
    Je vient de finir le tuto MSDN et leur exemple est fonctionnel meme si beaucoup plus lourd que ceux des autres tutos.

    Je me baserais sur celui ci jusqu'a acquerir la maitrise necessaire pour "alléger" le code.

    Merci encore à tous ceux qui ont prit le temps de m'aider à résoudre ce probleme.

    Je marque le probleme

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

Discussions similaires

  1. Probleme client socket
    Par BOUBOU81 dans le forum C++Builder
    Réponses: 7
    Dernier message: 19/04/2010, 21h03
  2. Perl probleme avec socket et Get
    Par killuaster dans le forum Programmation et administration système
    Réponses: 9
    Dernier message: 11/10/2006, 21h27
  3. Problemes des Sockets
    Par hinda dans le forum MFC
    Réponses: 1
    Dernier message: 14/06/2006, 16h03
  4. [VB6] Probleme de socket
    Par johnson95 dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 09/06/2006, 09h39
  5. [Debutant] Probleme connection socket
    Par sorry60 dans le forum Réseau
    Réponses: 38
    Dernier message: 12/11/2005, 11h46

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