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 :

socket send et recv


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    174
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 174
    Points : 74
    Points
    74
    Par défaut socket send et recv
    Bonjour,

    je suis débutant dans la programmation socket et j'ai déja eu des probleme que j'ai pu résoudre grace à l'aides des membres de ce site.

    J'ai aujourd'hui un nouveau probleme.
    voici mes code(je précise que je suis sur linux)

    code 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
     
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    #include <stdio.h>
    #include <stdlib.h> 
     
    #define INVALID_SOCKET -1
    #define SOCKET_ERROR -1
    #define closesocket(param) close(param)
     
    typedef int SOCKET;
    typedef struct sockaddr_in SOCKADDR_IN;
    typedef struct sockaddr SOCKADDR;
     
    int main()
    {
     
    SOCKET sock;
    char *buffer="buffer";
    sock=socket (AF_INET, SOCK_STREAM, 0);
    SOCKADDR_IN sin;
    sin.sin_addr.s_addr = htonl (INADDR_ANY);
    sin.sin_family = AF_INET;
    sin.sin_port = htons (65535);
    bind (sock, (SOCKADDR *) &sin, sizeof sin);
    listen(sock, 5);
    int taille = (int) sizeof(sin);
    accept (sock, (SOCKADDR *) &sin, &taille);
    printf("quelqu'un vient de se conecter\n");
    send(sock,buffer,strlen(buffer),0);
    closesocket(sock);
     
    return EXIT_SUCCESS;
    }


    code 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
     
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    #include <stdio.h>
    #include <stdlib.h> 
     
    #define INVALID_SOCKET -1
    #define SOCKET_ERROR -1
    #define closesocket(param) close(param)
     
    typedef int SOCKET;
    typedef struct sockaddr_in SOCKADDR_IN;
    typedef struct sockaddr SOCKADDR;
     
    int main()
    {
     
    SOCKET sock;
    char buffer[30];
    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 (65535);
    connect(sock, (SOCKADDR *)&sin, sizeof(sin));
    recv(sock,buffer,strlen(buffer),0);
    printf("%s\n",buffer);
    closesocket(sock);
     
    return EXIT_SUCCESS;
    }
    Comme vous pouvez le voir des que le programme client se connecte au serveur, le programme serveur affiche "quelqu'un vient de se conecter".
    Jusque la tout fonctionne bien.

    Ensuite le programme doit envoyer le message bonjour au client qui doit afficher le message bonjour.
    Cepandant le seul "message" que le client m'affiche est celui ci:
    http://saunivers.ifrance.com

    Pouvez vous m'aidez à résoudre ce probleme?

    merci d'avance

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

    Informations professionnelles :
    Activité : Étudiant

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

    J'ai fait les corrections ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ...
    /* La chaine de caractere doit se terminer par un saut de ligne (\n, \r ou \r\n) */
    char *buffer = "buffer\r\n";
    ...
    /* Ici, c'est OK */
    send (sock, buffer, strlen (buffer), 0);
    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    ...
    char buffer[30];
    ...
    /* strlen (buffer) dans l'etat actuel vaut 0. On ne recoit donc aucune donnee.
       la fonction recv attend la taille maximale du buffer, on utilise donc sizeof. */
    recv (sock, buffer, sizeof buffer, 0);
    /* Cependant, on recoit uniquement la chaine de caractere, sans le 0 final.
       A toi de le rajouter. Pour cela, il faut récupérer le nombre de bytes recus
       (retour de la fonction recv) et placer le 0 à la fin (si il reste de la place). */
    ...
    Bref, il reste encore des améliorations à faire. Si je me souviens bien, tu avais déjà posté à ce sujet, et je t'avais donné 2-3 conseils. Apparament tu ne les as pas suivi...

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    174
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 174
    Points : 74
    Points
    74
    Par défaut
    salut,

    merci de m'avoir répondu je n'ai en effet pas suivit tes conseil car pour l'instant je debute et donc je met un peu tout en vrac mais des que j'aurai réussi a transmettre le message bonjour je réorganiserai mon code en suivant tes conseil

    D[r]eadLock, si une ou certaine de mes fonctionaurait buger le code ne serai pas arriver a send ou recv.
    Or je reçoit quand meme des chose. Des chose bizarre mais des chose quand meme. Je me trompe?

  4. #4
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 729
    Points
    1 729
    Par défaut
    Le message que tu transmets actuellement ne contient pas de \0. Donc à la reception il faudrait le mettre manuellement (à l'aide du nombre d'octets ecrits dans le buffer, à savoir ce qui est retourné par recv). L'autre solution serait de transmettre "message" avec comme taille "strlen(message) + 1" (ce qui incluerait le \0 de la chaine d'origine dans le message à transmettre)

  5. #5
    Membre éclairé
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Points : 750
    Points
    750
    Par défaut
    Citation Envoyé par sebatlante Voir le message
    Or je reçoit quand meme des chose.
    Comment le sais-tu ? Il n'y a rien qui puisse (a part que le programme plante) t'empêcher d'aller jusqu'à l'affichage, et comme tu n'as pas initialisé ton buffer (il contient dont n'importe quoi) ...

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    174
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 174
    Points : 74
    Points
    74
    Par défaut
    je le sais parce que il m'affiche quelque chose comme je l'ai montrer sur l'image.

    Je peut toute fois me tromper(car selon toi ya rien qui peut empecher l'affichage)...Je suis encore debutant en programmation C.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    174
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 174
    Points : 74
    Points
    74
    Par défaut
    je vais ESSAYER de mettre mon code au clair

  8. #8
    Membre éclairé
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Points : 750
    Points
    750
    Par défaut
    Vérifie que les appels aux fonctions (socket, bind, connect, send, read) se sont bien déroulé !!!

Discussions similaires

  1. Réponses: 3
    Dernier message: 18/02/2015, 18h06
  2. Sur un socket : send et recv ou read et write ?
    Par Médinoc dans le forum Réseau
    Réponses: 35
    Dernier message: 05/11/2009, 15h51
  3. [socket] Pb send() et recv()
    Par Tymk dans le forum C++
    Réponses: 6
    Dernier message: 03/06/2008, 18h44
  4. [Socket] Send/Recv type double sur architectures différentes
    Par nicolas.pied dans le forum Réseau
    Réponses: 4
    Dernier message: 31/03/2006, 20h33

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