Pile des sockets

Utilisateur anonyme - 30 juil. 2003 à 22:15
 Utilisateur anonyme - 31 juil. 2003 à 15:18
Bonjour,

je suis toujours sur mon client serveur et j'ai un petit problème de paquets :

J'envoie des paquets de taille variable mais avec une taille maximum connue de tous les clients et du serveur (actuellement 512 octets). Par exemple j'envoie un paquet de 20 octets puis tout de suite après un paquet de 30, côté réception je lis les paquets avec un buffer de 512 octets.

J'ai 2 problèmes :
d'une part il me remplit le buffer avec les 2 paquets (le 20 + le 30)
d'autre part pendant qu'il est occupé à traiter le recv, l'envoi des autres paquets se termine (j'en envoie en fait une 15aine) pour dépasser finalement les fameux 512 octets, lorsqu'il a terminé de traiter le 1er pack de 512 octets, il retourne au WSAWaitEvent() et bien qu'il reste des paquets à lire, il attend... (j'ai mis l'évènement à auto-reset)

J'avais lu ici un conseil qui disait d'envoyer un paquet puis d'attendre un accusé de réception, mais ça risque de ralentir énormément les transferts :/ (en plus faut mettre un timeout :| ) et je ne suis pas sûr que ça règle le 2nd problème.

Comment dois-je m'y prendre pour contourner ça ? Y'a-t-il moyen de ne lire que vrai paquet par vrai paquet ?

7 réponses

Utilisateur anonyme
31 juil. 2003 à 09:41
Je sais que je n'ai posté qu'hier soir, mais je suis pressé :-), j'ajoute donc quelques infos :

Mes sockets sont en SOCK_STREAM et je travaille sous VC++.

Il doit bien y avoir un moyen de récupérer paquet par paquet et pas tout ce qui loge dans le buffer :/ snif snif
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
31 juil. 2003 à 13:54
Salut,
J'ai pas vraiment d'idées pour resoudre ton probleme, mais pourquoi tu tiens tant a recevoir paquet par paquet ?
0
Utilisateur anonyme
31 juil. 2003 à 14:06
Ce n'est pas tant "recevoir" mais "récupérer" paquet par paquet.

C'est parce que heuuu :)
Sérieusement c'est parce que par exemple mon client demande un groupe de fichiers au serveur, déjà chaque fichier est précédé d'un paquet d'informations sur le fichier (par exemple son emplacement sur le serveur), ce paquet est de taille inférieure à mon buffer de lecture, quand il lit le paquet d'information il embarque avec le début du premier paquet du fichier, c'est quand même très embêtant.
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
31 juil. 2003 à 14:34
Salut,
Je pense que le systeme avec accusé de reception dont tu parles plus haut est le meilleur.
Tu envoie un paquet d'info, et tu attend le feu vert du serveur pour commencer a envoyer le fichier lui meme.
Tu pense pas que ca fonctionnerai?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
31 juil. 2003 à 14:50
> Salut,
Salutations :)

> Je pense que le systeme avec accusé de reception dont tu parles plus haut est le meilleur.
> Tu envoie un paquet d'info, et tu attend le feu vert du serveur pour commencer a envoyer le fichier lui meme.
> Tu pense pas que ca fonctionnerai ?

Je pense aussi, mais j'ai une contrainte de timing, le système d'accusé de réception est bon mais il est lourd, je ne sais pas trop quelle est l'incidence sur la vitesse de transfert, mais mon serveur va envoyer périodiquement des données à au moins un client et le fait de devoir attendre le feu vert du client pour envoyer la suite est beaucoup plus lourd pour lui que de tout envoyer "d'un coup".

Je vais tester avec l'accusé de réception (mais mis seulement aux endroits où c'est nécessaire et non pas à tous les paquets) et voir si c'est acceptable ou même très bien (on ne sait jamais :)).

Merci.
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
31 juil. 2003 à 14:56
Salut,
Pour l'accusé de reception, pas besoin de faire un truc enorme. Un accusé de reception d'un octet devrait suffire. (genre un # ou un @).

Niveau timing, si tes fichiers font plus de 512octets, on est plus a 1 octet pret :)
0
Utilisateur anonyme
31 juil. 2003 à 15:18
> Pour l'accusé de reception, pas besoin de faire un truc enorme. Un accusé de reception d'un octet devrait suffire. (genre un # ou un @).

Oui oui c'était mon intention, j'ai déjà codé les requêtes/réponses avec une liste de code sur le premier octet du paquet, suffit d'en rajouter un :).

> Niveau timing, si tes fichiers font plus de 512octets, on est plus a 1 octet pret :)

Ce n'est pas le transfert de l'octet qui m'inquiète en fait :), c'est surtout qu'il faut attendre que le paquet de 512o soit arrivé + que la réponse revienne.

Pour chaque fichier ça me fait 2 accusés de réception c'est vrai que ce n'est pas énorme (surtout que pour l'instant mon groupe de fichier le plus élevé fait...2 fichier :)). En plus je suppose que sans accusé de réception on peut arriver à bourrer la pile du socket et déclencher un beau lag serveur :big) .

A propos, je peux monter la taille de paquet à combien en local/x-dsl/rtc ?

Je suppose qu'en rtc il ne faut pas dépasser 1ko et pour les deux autres 2 ou 3 ko (sous réserve que le réseau local ne soit pas trop grand (genre avec des vpn de la Hongrie jusqu'à la France au milieu hum)).
0
Rejoignez-nous