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 :

Socket sous Linux


Sujet :

C++

  1. #1
    Membre averti
    Inscrit en
    Ao�t 2004
    Messages
    28
    D�tails du profil
    Informations forums :
    Inscription : Ao�t 2004
    Messages : 28
    Par d�faut Socket sous Linux
    Bonjour,

    je test les sockets en C sous linux et j'ai realis� un code serveur un code client . Le client se connecte et envoie une chaine de caractere qui est retournee en majuscule par le serveur.

    Tous se passe bien en UDP mais en TCP mon code serveur plante a la fonction recv qui me renvoie -1. Ci dessous mon code serveur si qqun a une idee merci d'avance!!!

    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
     
    #include     <arpa/inet.h>
    #include     <netdb.h>
    #include     <netinet/in.h>
    #include     <iostream>
    #define MAX_MSG 65535
    using namespace std;
    int main()
    {
       int listenSocket, i;
       unsigned short int listenPort;
       socklen_t clientAddressLength;
       struct sockaddr_in clientAddress, serverAddress;
       char line[(MAX_MSG+1)];
       cout << "Enter port number to listen on (between 1500 and 65000): ";
       cin >> listenPort;
       // Create socket for listening for client connection requests.
    	listenSocket = socket(AF_INET, SOCK_STREAM, 0);//TCP : SOCK_STREAM, UDP : SOCK_DGRAM
       if (listenSocket < 0) {
     
          cerr << "cannot create listen socket";
          exit(1);
       }
       // Bind listen socket to listen port. First set various fields in
       // the serverAddress structure, then call bind().
       // htonl() and htons() convert long integers and short integers
       // (respectively) from host byte order (on x86 this is Least
       // Significant Byte first) to network byte order (Most Significant
       // Byte first).
       serverAddress.sin_family = AF_INET;
       serverAddress.sin_addr.s_addr = htonl(INADDR_ANY);
       serverAddress.sin_port = htons(listenPort);
       if (bind(listenSocket,
                    (struct sockaddr *) &serverAddress,
                    sizeof(serverAddress)) < 0) {
          cerr << "cannot bind socket";
          exit(1);
       }
       // Wait for connections from clients.
       // This is a non-blocking call; i.e., it registers this program with
       // the system as expecting connections on this socket, and then
       // this thread of execution continues on.
       listen(listenSocket, 5);
       cout << "Waiting for request on port " << listenPort << "\n";
       while (1) {
          clientAddressLength = sizeof(clientAddress);
          // First set line to all zeroes, so we'll know where
        // the end of the string is.
        memset(line, 0x0, (MAX_MSG+1));
     
    	 //ci dessous le cas UDP
    	/*int status = recvfrom(listenSocket, line, MAX_MSG, 0,
                     (struct sockaddr *) &clientAddress,             UDP
                     &clientAddressLength);*/
     
    	 int status = accept(listenSocket,(struct sockaddr *) &clientAddress,&clientAddressLength);
     
    	 if (status < 0)
    	 {
    		 cerr << "erreur accept " << status << endl;
    		 exit(1);
    	 }
     
     
    	status = recv(listenSocket, line, MAX_MSG, 0);	
    	// status = read(listenSocket,line,1);
    	if (status < 0)
    	{
    		cerr << " I/O Problem : " << status << endl /*<< WSAGetLastError() << endl*/;
          exit(1);
        }
        // show the client's IP address
        cout << " from " << inet_ntoa(clientAddress.sin_addr);
        // Show the client's port number.
        cout << ":" << ntohs(clientAddress.sin_port) << "\n";
        // Show the line
        cout << " Received: " << line << "\n";
        // Convert line to upper case.
        for (i = 0; line[i] != '\0'; i++)
          line[i] = toupper(line[i]);
        // Send converted line back to client.
        if (sendto(listenSocket, line, strlen(line) + 1, 0,
                   (struct sockaddr *) &clientAddress,
                   sizeof(clientAddress)) < 0)
          cerr << "Error: cannot send modified data";
        memset(line, 0x0, (MAX_MSG+1));       // set line to all zeroes
      }
    }

  2. #2
    Membre chevronn� Avatar de cmoibal
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    361
    D�tails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2007
    Messages : 361
    Par d�faut
    Est ce que tu a v�rifi� la valeur de errno ???

  3. #3
    Membre �prouv� Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    D�tails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Par d�faut
    bonjour,

    c'est pas beau.

    Sinon pour ton probleme tu peux peut etre avoir plus d info en fesant afficher ce que te donne
    sinon cherche sans la signature de emmanuel delahaye (un monsieur dont il faut ecouter les conseils) il a fait de bon tuto notement sur les sockets.

    l'adresse est de memoire : www.mapage.noos.fr/emdel/

    [edit] http://emmanuel-delahaye.developpez.com/ sans les 3w en fait

  4. #4
    Membre averti
    Inscrit en
    Ao�t 2004
    Messages
    28
    D�tails du profil
    Informations forums :
    Inscription : Ao�t 2004
    Messages : 28
    Par d�faut
    Bonjour,

    Tout d'abord merci pour vos reponse.

    errno vaut 107.

    Par ailleurs je n'ai pas trouv� de tuto sur les socket a al page http://emmanuel-delahaye.developpez.com/

    J'ai trouv� beaucoup de choses sur le net qui disent a peu pres toujours pareil. Je ne comprends vraiment pas ce que je fait de mal.....

  5. #5
    R�dacteur
    Avatar de Laurent Gomila
    Profil pro
    D�veloppeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    D�tails du profil
    Informations personnelles :
    �ge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par d�faut
    accept renvoie un nouveau socket pour la connexion entrante, et non pas un code d'erreur. C'est ensuite sur ce socket que tu dois recevoir les donn�es, pas sur ton �couteur.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int clientSocket = accept(listenSocket,(struct sockaddr *) &clientAddress,&clientAddressLength);
     
    if (clientSocket < 0)
    {
        cerr << "erreur accept " << endl;
        exit(1);
    }
     
    status = recv(clientSocket, line, MAX_MSG, 0);

  6. #6
    Membre �prouv� Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    D�tails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327

  7. #7
    Membre averti
    Inscrit en
    Ao�t 2004
    Messages
    28
    D�tails du profil
    Informations forums :
    Inscription : Ao�t 2004
    Messages : 28
    Par d�faut MErci
    Ok !!!

    effectivement, c'etait un probleme avec le accept.

    Probleme resolu !

    Merci a tous!

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. Socket sous linux
    Par Pierrick584 dans le forum D�buter
    R�ponses: 6
    Dernier message: 27/04/2010, 10h32
  2. Raw Socket sous linux
    Par geek-59600 dans le forum C++
    R�ponses: 12
    Dernier message: 14/10/2009, 21h55
  3. Socket sous Linux & Windows
    Par Jielde dans le forum Linux
    R�ponses: 3
    Dernier message: 17/06/2007, 14h04
  4. R�ponses: 17
    Dernier message: 15/05/2007, 18h35
  5. Probl�me erreurs sockets sous Linux
    Par Ange44 dans le forum Linux
    R�ponses: 6
    Dernier message: 05/09/2006, 16h16

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