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 :

[C/C++] probleme avec socket


Sujet :

C++

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 4
    Points : 1
    Points
    1
    Par défaut [C/C++] probleme avec socket
    Voila j'essaye d'utiliser les socket, j'arrive à envoyer une chaine de charactere quelconque et mon server l'affiche correctement. Le probléme c'est que le server ne semble pas vouloir accepter un deuxieme message provennant de mon client.

    La fonction send() ne me renvoie pas -1 donc à priori de son coté pas d'erreur il doit donc exister une subtilié qui m'echappe.

    Voila les sources du client et du server, bon je commence tout juste à bosser dessus donc c'est super bordelique et brouillon.

    le server :
    #include <cstdlib>
    #include <iostream>
    #include <winsock2.h>
    using namespace std;

    int main(int argc, char *argv[])
    {
    WSADATA WSAData;//les memes ..
    int stop=1;
    char buffer[50];
    for(int i=0;i<50;i++)buffer[i] = '\0';
    WSAStartup(MAKEWORD(2,0), &WSAData);
    SOCKET sock;
    SOCKET csock;//atention j'en ai fait 2 !!
    SOCKADDR_IN sin;
    SOCKADDR_IN csin;// tjr 2
    sock = socket(AF_INET, SOCK_STREAM, 0);
    sin.sin_addr.s_addr = INADDR_ANY;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(240);// bon on se met sur le bon port (on avait pris 240 )
    bind(sock, (SOCKADDR *)&sin, sizeof(sin));
    while(1)
    {
    bind(sock, (SOCKADDR *)&sin, sizeof(sin));
    stop = 1;
    listen(sock, 0);
    while(stop)
    {
    int sinsize = sizeof(csin);
    if((csock = accept(sock, (SOCKADDR *)&csin, &sinsize)) != INVALID_SOCKET)
    {stop = 0;
    cout << "Connection" << endl;
    }
    }
    recv(csock, buffer, 50, 0);
    printf("%s\n",buffer);

    }
    system("PAUSE");
    return EXIT_SUCCESS;
    }
    le client
    #include <cstdlib>
    #include <iostream>
    #include <winsock2.h>
    #include <string>
    using namespace std;

    int main(int argc, char *argv[])
    {
    int stop=1;
    string message;
    string message2;
    int i = 0;
    int taille;
    WSADATA WSAData;
    WSAStartup(MAKEWORD(2,0), &WSAData);
    SOCKET sock;
    SOCKADDR_IN sin;
    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(240);// j'ai choisi le port 240

    while(1)
    {
    i = 0;
    while(stop){
    if((connect(sock, (SOCKADDR *)&sin, sizeof(sin)))!= INVALID_SOCKET)
    {
    stop=0;
    cout << "Connect" << endl;
    }
    else if( i == 0)
    {
    cout << "Pas de serveur" << endl;
    i = 1;
    }
    }
    cout << "Entrer votre phrase" << endl;
    message2.erase();
    message.erase();
    do{
    cin >> message;
    if(message != ">") message2 = message2 +" "+ message;
    i++;
    }while(message != ">");
    cout << message2 << message2.size() << endl;
    taille = message2.size();
    if(send(sock, message2.c_str(), taille, 0) == -1) printf("Erreur\n");



    }
    system("PAUSE");
    return EXIT_SUCCESS;
    }
    Voila merci d'avance

    edit : je cherche pas specialement que l'on me passe un code qui marche mais juste qu'on m'explique comment en faire un moi même ^^

  2. #2
    Membre habitué Avatar de Ksempac
    Inscrit en
    Février 2007
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 165
    Points : 185
    Points
    185
    Par défaut
    Utilise la balise code plutot que la balise quote, ca permettra de colorer ton code et de l'indenter pour faciliter la lecture aux autres

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Server
    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[])
    {
    WSADATA WSAData;//les memes ..
    int stop=1;
    char buffer[50];
    for(int i=0;i<50;i++)buffer[i] = '\0';
    WSAStartup(MAKEWORD(2,0), &WSAData);
    SOCKET sock;
    SOCKET csock;//atention j'en ai fait 2 !!
    SOCKADDR_IN sin;
    SOCKADDR_IN csin;// tjr 2
    sock = socket(AF_INET, SOCK_STREAM, 0);
    sin.sin_addr.s_addr = INADDR_ANY;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(240);// bon on se met sur le bon port (on avait pris 240 )
    bind(sock, (SOCKADDR *)&sin, sizeof(sin));
    while(1)
    {
    bind(sock, (SOCKADDR *)&sin, sizeof(sin));
    stop = 1;
    listen(sock, 0);
    while(stop)
    {
    int sinsize = sizeof(csin);
    if((csock = accept(sock, (SOCKADDR *)&csin, &sinsize)) != INVALID_SOCKET)
    {stop = 0;
    cout << "Connection" << endl;
    }
    }
    recv(csock, buffer, 50, 0);
    printf("%s\n",buffer);
     
    }
    system("PAUSE");
    return EXIT_SUCCESS;
    }
    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
    55
    #include <cstdlib>
    #include <iostream>
    #include <winsock2.h>
    #include <string>
    using namespace std;
     
    int main(int argc, char *argv[])
    {
    int stop=1;
    string message;
    string message2;
    int i = 0;
    int taille;
    WSADATA WSAData;
    WSAStartup(MAKEWORD(2,0), &WSAData);
    SOCKET sock;
    SOCKADDR_IN sin;
    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(240);// j'ai choisi le port 240
     
    while(1)
    {
    i = 0;
    while(stop){
    if((connect(sock, (SOCKADDR *)&sin, sizeof(sin)))!= INVALID_SOCKET)
    {
    stop=0;
    cout << "Connect" << endl;
    }
    else if( i == 0)
    {
    cout << "Pas de serveur" << endl;
    i = 1;
    }
    }
    cout << "Entrer votre phrase" << endl;
    message2.erase();
    message.erase();
    do{
    cin >> message;
    if(message != ">") message2 = message2 +" "+ message;
    i++;
    }while(message != ">");
    cout << message2 << message2.size() << endl;
    taille = message2.size();
    if(send(sock, message2.c_str(), taille, 0) == -1) printf("Erreur\n");
     
     
     
    }
    system("PAUSE");
    return EXIT_SUCCESS;
    }
    Efffectivement c'est bien plus lisible merci ^^.

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 577
    Points : 256
    Points
    256
    Par défaut
    salut,
    d'apres ce que je vois, tu acceptes une connexion, puis tu restes bloqué sur le recv() en attente d'une trame.
    Quand tu la reçois, tu l'affiches, et tu reviens en attente de nouvelle connexion sur ton accept().
    Donc c'est pas bon, il te faut une boucle qui inclue ton recv()

    accept()
    while(1)
    {
    recv()
    cout << buffer;
    }

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Oki merci beaucoup.

    J'avais trouvé moi même comment palié à cette erreur, je deconnecte reconnecte le client à chaque fois qu'il voulait envoyé un nouveau message mais je ne sais pas si cette méthode et tres élégante. J'ai également fait en sorte que le client demande la chaine de caractere avant de se connecter au server (ce qui evite qu'il bloque le port).

    J'apprend tout seul docn je suis pas sure de toujours faire ça élégament et de façon propore

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Voila la derniere version. ça fonctionne parfaitement mais je m'y prend peut être mal donc j'aimerai votre avis.

    server :
    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
    #include <cstdlib>
    #include <iostream>
    #include <winsock2.h>
    using namespace std;
     
    void ecouter();
     
    int main(int argc, char *argv[])
    {
     
        ecouter();
     
        system("PAUSE");
        return EXIT_SUCCESS;
    }
     
    void ecouter()
    {
    WSADATA WSAData;//les memes ..
    int stop=1;
    char buffer[50];
    for(int i=0;i<50;i++)buffer[i] = '\0';
    WSAStartup(MAKEWORD(2,0), &WSAData);
    SOCKET sock;
    SOCKET csock;//atention j'en ai fait 2 !!
    SOCKADDR_IN sin;
    SOCKADDR_IN csin;// tjr 2
    sock = socket(AF_INET, SOCK_STREAM, 0);
    sin.sin_addr.s_addr            = INADDR_ANY;
    sin.sin_family                = AF_INET;
    sin.sin_port                = htons(240);// bon on se met sur le bon port (on avait pris 240 )
    bind(sock, (SOCKADDR *)&sin, sizeof(sin));
     
     
    while(1)
    {
    //on reinitialise le buffer        
    for(int i=0;i<50;i++)buffer[i] = '\0';
     
     
    stop = 1;
    listen(sock, 0);
    while(stop)
    {
    int sinsize = sizeof(csin);
    if((csock = accept(sock, (SOCKADDR *)&csin, &sinsize)) != INVALID_SOCKET) stop = 0;
     
    }  
    recv(csock, buffer, 50, 0);
    printf("%s\n",buffer);
     
    }
    }
    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    #include <cstdlib>
    #include <iostream>
    #include <winsock2.h>
    #include <string>
    using namespace std;
    void talk(string name);
    bool test();
    string phrase(string name);
     
     
    int main(int argc, char *argv[])
    {
             cout << "Connecting..." << endl;
             while(!test());
             string name;
             cout << "Entrez votre nom : ";
             cin >> name;
     
    while(1) 
    {
     
             talk(name);
    }
     
     
     
    system("PAUSE");
    return EXIT_SUCCESS;
    }
     
     
     
     
    void talk(string name)
    {
    int stop=1;
    string message;
    int i = 0;
    int taille;
    WSADATA WSAData;
    WSAStartup(MAKEWORD(2,0), &WSAData);
    SOCKET sock;
    SOCKADDR_IN sin;
    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(240);// j'ai choisi le port 240
     
     
    //on saisis la chaine de carac à entrer
    message.erase();
    message = phrase(name);
    taille = message.size();
     
    //on se connecte
    while(stop){
    if((connect(sock, (SOCKADDR *)&sin, sizeof(sin)))!= INVALID_SOCKET)
    {
                      stop=0;
    }
    else if( i == 0)
    {
         cout << "Erreur" << endl;
         i = 1;
    }
    }
     
    //on envoie le message
    if(send(sock, message.c_str(), taille, 0) == -1) printf("Erreur\n");
     
    //on ferme le socket
    closesocket(sock);
    WSACleanup();
    }
     
    string phrase(string name)
    {
           string message2;
           string message;
     
           cout << "Entrer votre phrase pour terminer ecrivez > " << endl;
     
           message2.erase();
           message.erase();
           message2 = name + " : \n";
           do{
              cin >> message;
              if(message != ">") message2 = message2 + message + " ";
           }while(message != ">");
     
           return message2;
    }
     
    bool test()
    {
     
    bool result;
     
    WSADATA WSAData;
    WSAStartup(MAKEWORD(2,0), &WSAData);
    SOCKET sock;
    SOCKADDR_IN sin;
    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(240);// j'ai choisi le port 240
     
     
    //on se connecte
     
    if((connect(sock, (SOCKADDR *)&sin, sizeof(sin)))!= INVALID_SOCKET)
    {
                      send(sock, "Client connection test", 25, 0);
                      return true;
    }
    else              return false;
    }

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 577
    Points : 256
    Points
    256
    Par défaut
    Bon, mis part que c'est du C et non du C++ :

    - Si j'envoie une trame de + de 50 caracteres, il se passe quoi ? -> c'est coupé à 50 caractères !!
    - Si accept() te reourne INVALID_SOCKET, tu ne dois pas aller sur ton recv()
    _ initialiser un buffer avec un for n'est pas terrible. A la limite utilise memset
    - Je ne trouve pas bien de se reconnecter chaque fois

Discussions similaires

  1. probleme avec socket
    Par ben83510 dans le forum C
    Réponses: 3
    Dernier message: 18/01/2010, 14h57
  2. [C] Probleme avec socket client-serveur TCP
    Par LinuxUser dans le forum Réseau
    Réponses: 33
    Dernier message: 15/05/2007, 22h26
  3. 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
  4. [socket] Probleme avec connect
    Par sorry60 dans le forum Réseau
    Réponses: 12
    Dernier message: 16/11/2005, 22h01
  5. Probleme avec des socket !
    Par Ptimath44 dans le forum Réseau
    Réponses: 11
    Dernier message: 31/10/2005, 18h11

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