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

Développement Discussion :

[TCP] Taille de buffer, et fonction send()


Sujet :

Développement

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 17
    Points : 9
    Points
    9
    Par défaut [TCP] Taille de buffer, et fonction send()
    Re-bonjour,

    Tout d'abord je précise que je code sous windows.
    Mon code de client / serveur marchait bien, jusqu'au moment ou j'ai voulu changer la taille max de mon buffer d'envoi, a ce moment la le serveur plante, car n'arrive pas a effectuer le send (qui me retourne -1), j'explique :

    En gros, j'ai un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char data[BUF_SIZE]; // Data buffer
    memset(data,0,sizeof(data));
    int data_len = sizeof(data); // Length initialisation
    Je précise que ce bout de code est dans le main, ou sont aussi mes appels a send et recv. BUF_SIZE est defini hors du main.

    Edit : si je defini mon data hors du main, ca ne marche pas, quelque soit la taille.

    Coté client : apres avoir fait mon connect(), qui fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    len = recv(sockfd,buffer,BUF_SIZE,0); // Waiting for ID reception
    Je recupere un identifiant que le serveur m'envoie.

    Coté serveur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    sprintf_s(data,"%d",clientMax);
    				
    data_len=send(connfd[clientMax], data,5, 0);
    Le probleme est que si BUF_SIZE vaut 512 cela fait planter le serveur, le send ne fonctionne pas. Si je met 255 cela marche parfaitement ...

    Je ne comprend pas vu que je lui demande d'envoyer 5 octet, et non pas tout le buffer ! En quoi la taille maximal du buffer influerait elle dans mon envoi?

    Edit 2 : en declarant data comme etant un char* et en effectuant un malloc, ca marche ! quelqu'un pourrait m'expliquer pourquoi? * ne comprend rien*

  2. #2
    Membre expérimenté
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Points : 1 421
    Points
    1 421
    Par défaut
    avec ce que tu donne, c'est pas evident.

    je dirais qu'apparement tu utilise un protocole texte?

    surement un oubli de '\0' en fin de chaine. (ce qui expliquerais le segfault en "dur" et pas en dynamique)

    et puis: est-tu sur du resultat de la conversion de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sprintf_s(data,"%d",clientMax);
    tu devrais tester son retour (comme je te l'ai deja dis dans un precedent sujet: on teste toujours le retour des fonctions ) pour eviter de faire n'importe quoi avec l'index de ton tableau.
    comment est declaré clientMax? la fonction n'a-t'elle pas besoin de l'addresse de ta variable plutot?

    en principe on fait (dans le cas d'un protocole texte, et ça semble etre le cas):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char data[BUF_SIZE+1]; // Data buffer
    [...]
    len = recv(sockfd,buffer,BUF_SIZE,0); // Waiting for ID reception
    data[len] = '\0';
    pour etre sur, quoi qu'il arrive, d'avoir un '\0' a la fin de notre chaine.

    --
    edit: c'est seulement des pistes de recherche. il serait interressant d'avoir un code minimal reproduisant le "bug" histoire de ...
    click my www
    ............|___
    ...................\
    .................._|_
    ..................\ /
    ..................."

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 17
    Points : 9
    Points
    9
    Par défaut
    Alors, je suis sur des retours de mes fonctions (mais c'est vrai qu'il faudrait que je me mette a les tester systematiquement, ce que je ne fais pas !), puisqu'avec un buffer d'une certaine taille ca marche, le probleme vient juste quand on depasse une certaine taille !

    Je pencherais plus pour un probleme d'allocation mémoire quand on declare un char[], puisque le probleme se résout lorsque l'on declare un char* et que l'on effectue un malloc...

  4. #4
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Par hasard, tu avais bien recompilé tout le projet ? Histoire que BUF_SIZE ne soit pas différent entre deux fichiers

    Sinon, il faut systèmatiquement tester les valeurs de retour de toutes les fonctions, surtout en réseau car les erreurs peuvent arriver de partout. Et si tu veux pas un serveur qui tombe à l'eau en lancait des paquets foireux ou en faisant des déconnexions sauvages, il faut absoluement faire ces tests

    int data_len = sizeof(data);
    Au passage, sizeof retourne un size_t.
    Je ne répondrai à aucune question technique en privé

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 17
    Points : 9
    Points
    9
    Par défaut
    Merci pour vos reponses,

    Je viens de reperer un peu plus precisement mon probleme, que je trouve completement ahurissant, j'explique :

    Je travaille avec visual studio express 2005, j'ai une solution qui contient 2 projets : le client, et le serveur. J'ai un dossier common que j'ai ajouté aux deux projets.

    Il y a deux problemes :

    -Le premier qui survient aléatoirement : lorsque je declare une variable globale (hors d'une methode) dans un .cpp du dossier common, donc que les 2 projets utilisent, et que je lance le serveur et le client en local, le serveur refuse l'accept() de la connexion tcp et renvoie -1. (d'ailleur y a t'il un moyen de connaitre plus precisement la nature de l'erreur?)

    -Le deuxieme, qui survient a chaque fois : lorsque je compile en mode débug, et que j'execute en mode debug, l'accept() foire a chaque fois. Alors je me dis que peut etre c'est normal en mode debug on peut pas utilsier de reseau ou je sais pas .. Le probleme c'est que le client marche tres bien en mode debug ! C'est juste le serveur qui pose probleme !!

    Alors la je me demande :

    - Y a t'il des precautions a prendre lorsque l'on a des fichiers communs, et qu'on utilise les 2 appli en local ?

    - Y a t'il des choses a savoir concernant VC++, le mode debug, et le reseau?

    Merci !

Discussions similaires

  1. Probléme de communication TCP/IP avec fonction send bloqué
    Par TheToune dans le forum Développement
    Réponses: 0
    Dernier message: 21/09/2011, 10h05
  2. Réponses: 8
    Dernier message: 30/09/2010, 21h25
  3. blocage de la fonction : send
    Par fregolo52 dans le forum Réseau
    Réponses: 5
    Dernier message: 20/09/2005, 09h10
  4. Réponses: 2
    Dernier message: 30/08/2005, 15h28
  5. Réponses: 2
    Dernier message: 17/08/2005, 15h08

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