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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    4
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 4
    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 exp�riment� Avatar de Ksempac
    Inscrit en
    F�vrier 2007
    Messages
    165
    D�tails du profil
    Informations forums :
    Inscription : F�vrier 2007
    Messages : 165
    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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    4
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 4
    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 �clair�
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    577
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 577
    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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    4
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 4
    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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    4
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 4
    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 �clair�
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    577
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 577
    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