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 :

recv(): Result too large


Sujet :

Réseau C

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 10
    Par défaut recv(): Result too large
    Bonjour


    J'ai un probleme avec mon serveur/client, en effet lorsque j'essaye d'envoyer un char, recv me retourne "recv(): Result too large"

    Le 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
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
     
     
    #ifdef __cplusplus
        #include <cstdlib>
    #else
        #include <stdlib.h>
    #endif
     
    #include <SDL/SDL.h>
     
    #include <winsock2.h>
     
    #define PORT 2014
     
     
    int main ( int argc, char** argv )
    {
     
        atexit(SDL_Quit);
        freopen("CON", "w", stdout);
        freopen("CON", "r", stdin);
        freopen("CON", "w", stderr);
     
        putenv("SDL_VIDEO_WINDOW_POS=center");
     
     
        SDL_Surface* screen = SDL_SetVideoMode(640, 480, 32,
                                               SDL_HWSURFACE|SDL_DOUBLEBUF);
     
        SDL_Surface* bmp = SDL_LoadBMP("cb.bmp");
     
        SDL_Rect dstrect;
        dstrect.x = (screen->w - bmp->w) / 2;
        dstrect.y = (screen->h - bmp->h) / 2;
     
        /* Socket */
     
        WSADATA WSAData;
        WSAStartup(MAKEWORD(2,0), &WSAData);
     
        SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
        if(sock == INVALID_SOCKET)
        {
            perror("socket()");
            exit(errno);
        }
        else
        {
            printf("socket : OK\n");
        }
     
        /* Interface de connexion */
     
        SOCKADDR_IN sin = { 0 };
     
        sin.sin_addr.s_addr = htonl(INADDR_ANY); /* nous sommes un serveur, nous acceptons n'importe quelle adresse */
     
        sin.sin_family = AF_INET;
     
        sin.sin_port = htons(PORT);
     
        if(bind (sock, (SOCKADDR *) &sin, sizeof sin) == SOCKET_ERROR)
        {
            perror("bind()");
            exit(errno);
        }
        else
        {
            printf("interface de connexion : OK\n");
        }
     
        /* Ecoute */
     
        if(listen(sock, 5) == SOCKET_ERROR)
        {
            perror("listen()");
            exit(errno);
        }
        else
        {
            printf("ecoute : OK\n");
        }
     
        printf("En attente d'un client...\n");
     
        /* Limite connexion */
     
        SOCKADDR_IN csin = { 0 };
        SOCKET csock;
     
     
        int sinsize = sizeof csin;
     
        csock = accept(sock, (SOCKADDR *)&csin, &sinsize);
     
        if(csock == INVALID_SOCKET)
        {
            perror("accept()");
            exit(errno);
        }
        else
        {
            printf("connexion : OK\n");
        }
     
     
        char buffer[1000] = "test";
        int n = 0;
     
        if((n = recv(sock, buffer, sizeof(buffer-1), 0)) <= 0 )
        {
            perror("recv()");
            exit(errno);
        }
     
        buffer[n] = '\0';
     
     
     
     
     
     
        bool done = false;
        while (!done)
        {
     
            SDL_Event event;
            while (SDL_PollEvent(&event))
            {
     
                switch (event.type)
                {
     
                case SDL_QUIT:
                    done = true;
                    break;
     
     
                case SDL_KEYDOWN:
                    {
     
                        if (event.key.keysym.sym == SDLK_ESCAPE)
                            done = true;
                        break;
                    }
                }
            }
            SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, 0, 0, 0));
     
            SDL_BlitSurface(bmp, 0, screen, &dstrect);
     
     
            SDL_Flip(screen);
        }
     
        SDL_FreeSurface(bmp);
        closesocket(sock);
        closesocket(csock);
     
        printf("Exited cleanly\n");
        return 0;
    }
    Le 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
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
     
     
    #ifdef __cplusplus
        #include <cstdlib>
    #else
        #include <stdlib.h>
    #endif
     
    #include <SDL/SDL.h>
     
    #include <winsock2.h>
     
    #define PORT 2014
     
     
    int main ( int argc, char** argv )
    {
     
        atexit(SDL_Quit);
        freopen("CON", "w", stdout);
        freopen("CON", "r", stdin);
        freopen("CON", "w", stderr);
     
        putenv("SDL_VIDEO_WINDOW_POS=center");
     
     
        SDL_Surface* screen = SDL_SetVideoMode(640, 480, 32,
                                               SDL_HWSURFACE|SDL_DOUBLEBUF);
     
        SDL_Surface* bmp = SDL_LoadBMP("cb.bmp");
     
        SDL_Rect dstrect;
        dstrect.x = (screen->w - bmp->w) / 2;
        dstrect.y = (screen->h - bmp->h) / 2;
     
        int connected = 0;
     
        /* Socket */
     
        WSADATA WSAData;
        WSAStartup(MAKEWORD(2,0), &WSAData);
     
        SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
        if(sock == INVALID_SOCKET)
        {
            perror("socket()");
            exit(errno);
        }
        else
        {
            printf("socket : OK\n");
        }
     
        /* Connexion */
     
        struct hostent *hostinfo = NULL;
        SOCKADDR_IN sin = { 0 }; /* initialise la structure avec des 0 */
        const char *hostname = "25.143.140.161";
     
        hostinfo = gethostbyname(hostname); /* on récupère les informations de l'hôte auquel on veut se connecter */
        if (hostinfo == NULL) /* l'hôte n'existe pas */
        {
            fprintf (stderr, "Unknown host %s.\n", hostname);
            exit(EXIT_FAILURE);
        }
     
        sin.sin_addr = *(IN_ADDR *) hostinfo->h_addr; /* l'adresse se trouve dans le champ h_addr de la structure hostinfo */
        sin.sin_port = htons(PORT); /* on utilise htons pour le port */
        sin.sin_family = AF_INET;
     
        while (connected == 0 )
        {
            if(connect(sock,(SOCKADDR *) &sin, sizeof(SOCKADDR)) == SOCKET_ERROR)
            {
                perror("connect()");
            }
            else
            {
                connected = 1;
            }
        }
     
        char buffer[100] = "test";
     
        printf("connected\n");
        if(send(sock, buffer, sizeof(buffer-1), 0) <= 0)
        {
            perror("send()");
            exit(errno);
        }
        else
        {
            printf("socket envoye \n");
        }
     
     
     
        bool done = false;
        while (!done)
        {
     
            SDL_Event event;
            while (SDL_PollEvent(&event))
            {
     
                switch (event.type)
                {
     
                case SDL_QUIT:
                    done = true;
                    break;
     
     
                case SDL_KEYDOWN:
                    {
     
                        if (event.key.keysym.sym == SDLK_ESCAPE)
                            done = true;
                        break;
                    }
                }
            }
            SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, 0, 0, 0));
     
            SDL_BlitSurface(bmp, 0, screen, &dstrect);
     
     
            SDL_Flip(screen);
        }
     
        SDL_FreeSurface(bmp);
     
        printf("Exited cleanly\n");
        return 0;
    }
    Des solutions?

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 492
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
    WSAEMSGSIZE
    The message was too large to fit into the specified buffer and was truncated.
    Si au lieu de 1000, tu mets un buffer de 5000 ?

    Qu'est ce que la paire distante envoie comme données ? 100 chars ?

    EDIT : tu es sous Windows, tu pourrais plutôt regarder l'erreur renvoyée par WSAGetLastError() en plus de ce que t'affiche perror() pour vérifier que cela soit correct. Voir mon article sur les erreurs des sockets : http://gradot.wordpress.com/2013/07/...-sockets-en-c/

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 10
    Par défaut
    Merci de ta réponse

    Si je met un buffer de 5000, ca ne change rien

    J'ai ajouter un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("WSAGetLastError : %d\n", WSAGetLastError());
    WSAGetLastError() me retourne 6.
    J'ai regarder sur Google c'est "WSA_INVALID_HANDLE"

    Je ne comprend pas le probleme

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 492
    Billets dans le blog
    1
    Par défaut
    Un relisant les quelques lignes au-dessus du rcv(), je pense que tu n'utilises pas le "bon socket", d'où l'erreur. En effet, sock est le socket servant à l'écoute et c'est csock qui est le retour d'accept, donc le socket de communication avec le client. D'où le c comme client devant sock. Essaye de changer ton recv() pour qu'il travaille sur csock.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 10
    Par défaut
    Merci beaucoup Bktero !
    Résolu, c'était bien le mauvais socket que j'utilisais !

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

Discussions similaires

  1. Lecture fichier texte - Exception (Result too large)
    Par HELKARROUMI dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 19/05/2014, 17h07
  2. bind: Result too large
    Par Trietch dans le forum Réseau
    Réponses: 8
    Dernier message: 26/07/2013, 02h39
  3. connect() - result too large
    Par stephane543 dans le forum Réseau
    Réponses: 4
    Dernier message: 03/05/2010, 00h54
  4. Réponses: 1
    Dernier message: 22/07/2005, 13h32
  5. Error 124 : statement part too large
    Par cedchantrel dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 29/03/2005, 10h30

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