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

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    mars 2017
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mars 2017
    Messages : 14
    Points : 11
    Points
    11

    Par défaut Client serveur, message envoyé mais pas reçu

    Bonjour,

    J'ai écris un client serveur en C, envoyant un message en json (librairie json-c : https://github.com/json-c/json-c ).
    La connexion s'effectue bien entre le client et le serveur, le client envoyé bien un message (retour de send : 167), mais le serveur ne reçoit rien (retour de recv = -1 ). J'ai essayé de voir si l'erreur venait d'ailleurs, mais ça n'a pas l'air d'être le cas (au vue des retours que j'ai).


    Voici mon 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
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <errno.h>
    #include <string.h>
    #include <sys/types.h>
    #include <winsock2.h>
    #include <winsock.h>
    #include "json.h"
    
    #pragma comment(lib, "ws2_32.lib")
    
    #define MAX_SIZE 100
    
    int main()
    {
        //Obligatoire pour Windows
        WSADATA wsaData;
       	WSAStartup(MAKEWORD(2, 2), &wsaData);
    
    
        char* str;
        int fd = 0;
        struct sockaddr_in demoserverAddr;
    
        fd = socket(AF_INET, SOCK_STREAM, 0);
    
        if (fd < 0)
        {
            printf("Error : Could not create socket\n");
            Sleep(1000);
            return 1;
        }
        else
        {
            demoserverAddr.sin_family = AF_INET;
            demoserverAddr.sin_port = htons(8888); //a modifier pour correspondre au bonne adresse
            demoserverAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); //idem
            memset(demoserverAddr.sin_zero, '\0', sizeof(demoserverAddr.sin_zero));
        }
    
        if (connect(fd, (const struct sockaddr *)&demoserverAddr, sizeof(demoserverAddr)) < 0)
        {
            printf("ERROR connecting to server\n");
            Sleep(1000);
            return 1;
        }
    
        /*Creating a json object*/
        json_object *jobj = json_object_new_object();
    
        /*Creating a json string*/
        json_object *jstring = json_object_new_string("Joys of Programming");
    
        /*Creating a json integer*/
        json_object *jint = json_object_new_int(10);
    
        /*Creating a json boolean*/
        json_object *jboolean = json_object_new_boolean(1);
    
        /*Creating a json double*/
        json_object *jdouble = json_object_new_double(2.14);
    
        /*Creating a json array*/
        json_object *jarray = json_object_new_array();
    
        /*Creating json strings*/
        json_object *jstring1 = json_object_new_string("c");
        json_object *jstring2 = json_object_new_string("c++");
        json_object *jstring3 = json_object_new_string("php");
    
        /*Adding the above created json strings to the array*/
        json_object_array_add(jarray,jstring1);
        json_object_array_add(jarray,jstring2);
        json_object_array_add(jarray,jstring3);
    
        /*Form the json object*/
        /*Each of these is like a key value pair*/
        json_object_object_add(jobj,"Site Name", jstring);
        json_object_object_add(jobj,"Technical blog", jboolean);
        json_object_object_add(jobj,"Average posts per day", jdouble);
        json_object_object_add(jobj,"Number of posts", jint);
        json_object_object_add(jobj,"Categories", jarray);
    
        printf("Size of JSON object- %lu\n", sizeof(jobj));
        printf("Size of JSON_TO_STRING- %lu,\n %s\n", sizeof(json_object_to_json_string(jobj)), json_object_to_json_string(jobj));
        //printf("Size of string- %lu\n", sizeof(json_object_to_json_string(jobj)));
    
        char temp_buff[MAX_SIZE];
    
        if (strcpy(temp_buff, json_object_to_json_string(jobj)) == NULL)
        {
            perror("strcpy");
            Sleep(5000);
            return EXIT_FAILURE;
        }
        int r = 0;
        r = send(fd, temp_buff, strlen(temp_buff),0);
        if (r == -1) //checke
        {
            perror("write");
            Sleep(5000);
            return EXIT_FAILURE;
        }
        printf("nb caractere envoyé : %i",r);
        printf("Written data\n");
        Sleep(2000);
        WSACleanup();
        return EXIT_SUCCESS;
    }
    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
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <errno.h>
    #include <string.h>
    #include "json.h"
    #include <sys/types.h>
    #include <winsock2.h>
    #include <winsock.h>
     
    #pragma comment(lib, "ws2_32.lib")
     
    #define MAX_SIZE 500
     
    int main()
    {
        //obligatoire pour windows
        WSADATA wsaData;
       	WSAStartup(MAKEWORD(2, 2), &wsaData);
     
        int listenfd = 0, connfd = 0;   //related with the server
        struct sockaddr_in serv_addr;
     
        //json_object * jobj;
        uint8_t buf[158], i;
     
        memset(&buf, '0', sizeof(buf));
     
        //Création socket
        listenfd = socket(AF_INET, SOCK_STREAM, 0);
        if(listenfd == -1)
        {
            printf("Probleme creation socket \n");
        }
        else
        {
            puts("Socket cree");
        }
     
        serv_addr.sin_family = AF_INET;
        serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
        serv_addr.sin_port = htons(8888);
     
        if(bind(listenfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0)
        {
            printf("Bind error \n");
        }
        else
        {
                puts("bind fait");
        }
     
        //Listen
        listen(listenfd, 5);
        printf("listening\n");
        printf("connfd : %i \n",connfd);
     
        connfd = accept(listenfd, (struct sockaddr*)NULL, NULL);
        if(connfd == SOCKET_ERROR)
        {
            perror("accept()");
        }
        printf("connfd : %i \n",connfd); //ok
        printf("Reading from client\n");
     
        int r;
     
        char buff[MAX_SIZE];
        printf("Max size : %i \n", MAX_SIZE); // ok
        Sleep(3000);
        for (;;)
        {
            printf("%c \n", buff);
            r = recv(connfd, buff, MAX_SIZE,0);
            Sleep(500);
            printf("longueur buff : %i \n",r);
            buff[r]=0;
            printf("%c \n",buff);
            if (r == -1)
            {
                perror("read");
                printf("1 \n");
                Sleep(2000);
                return EXIT_FAILURE;
            }
            if (r == 0)
                printf("2 \n");
                break;
     
            printf("READ: %s\n", buff);
        }
        Sleep(3000);
        WSACleanup();
        return EXIT_SUCCESS;
    }
    Est ce que quelqu'un aurait déjà été confronté à ce problème ou serait comment le résoudre?
    Merci d'avance

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    juin 2007
    Messages
    5 143
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : juin 2007
    Messages : 5 143
    Points : 16 942
    Points
    16 942

    Par défaut

    As-tu regardé avec wireshark (ou un équivalent) si le message a bien transité sur le réseau (via la socket)?
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    juin 2010
    Messages
    6 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : juin 2010
    Messages : 6 037
    Points : 26 936
    Points
    26 936
    Billets dans le blog
    2

    Par défaut

    Vu que le client attend 2s après l'envoi puis se déconnecte et arrête, alors que le serveur attend 3s après avoir reçu une connection pour recevoir les données..... quand le serveur espère appeler recv le client est déjà déconnecté.
    Enfin pour savoir l'erreur de réception, il faut utiliser WSAGetLastError. http://bousk.developpez.com/cours/re...iers-pas/#LIII
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    mars 2017
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mars 2017
    Messages : 14
    Points : 11
    Points
    11

    Par défaut

    Merci Bousk, l'erreur venait bien de la !
    J'y avais pas dutout penser, merci encore

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

Discussions similaires

  1. Client/Serveur Socket, envoyer un message précis
    Par Chyokyka dans le forum Débutant
    Réponses: 4
    Dernier message: 24/03/2009, 17h59
  2. [WD12] client/serveur chez moi, mais pas chez les autres ?
    Par daphi dans le forum HyperFileSQL
    Réponses: 5
    Dernier message: 19/03/2009, 18h43
  3. Réponses: 1
    Dernier message: 04/12/2008, 23h42
  4. https message IE mais pas FF
    Par grabriel dans le forum Sécurité
    Réponses: 1
    Dernier message: 17/06/2008, 14h37
  5. mail non envoyé mais pas d'erreur
    Par leam69 dans le forum Linux
    Réponses: 2
    Dernier message: 25/10/2007, 12h12

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