OVH Cloud OVH Cloud

'flusher' une socket en C

11 réponses
Avatar
jh
Bonjour,

j'ai ecrit une appli client pour parler a un serveur, jusque la, rien de bien
palpitant, tout ca se passe en udp, mon probleme vient du fait que le serveur
peut fragmenter ce qu'il envoit (qd cela depasse approximativement 1400 octets)
il n'y a aucune regle particuliere (taille, fin ou debut de paquet special, etc)
alors, j'ai decidé de recevoir en boucle ce que le serveur m'envoit tant que je
recois encore qqchose, et c'est la que je me suis rendu compte qu'en fait, je
'recois' 5 ou 6 fois la meme chose.
Ma question est alors simple : comment flusher le buffer de reception ?

je me permets un crosspost sur fclc avec un fu2 sur fcou, a l'epoque ou je
postais encore sur usenet, c'etait largement toléré, desolé si ca a changé
depuis.

--
je suis si magnifique =( / je suis si mysterieuse =(
le mystere est-il magnifique ? =(

10 réponses

1 2
Avatar
Jean Hoffmann
[post]

desolé, il semblerait que mon ~/.slrnrc ait disparu depuis que je ne poste plus
trop sur usenet, et j'ai oublié de préciser que je n'ai pas trouvé de doc
en googlant, et que le unix socket faq : http://www.developerweb.net/sock-faq/
semble avoir des problemes.

--
je suis si magnifique =( / je suis si mysterieuse =(
le mystere est-il magnifique ? =(
Avatar
Manuel Leclerc

j'ai ecrit une appli client pour parler a un serveur, jusque
la, rien de bien palpitant, tout ca se passe en udp, mon probleme
^^^ ^^^^^^^^


Voilà, non ?

--
I have systematically eliminated all references to "software",
because some people disagree about what it means.
--Andrew Suffield

Avatar
Jean Hoffmann
Le 18-06-2004, Manuel Leclerc a écrit :

j'ai ecrit une appli client pour parler a un serveur, jusque
la, rien de bien palpitant, tout ca se passe en udp, mon probleme
^^^ ^^^^^^^^


Voilà, non ?



je ne suis pas bien sur de comprendre toute la portée comique de la reponse, et
j'en profite pour dire que je n'ai pas ecrit le serveur et ne peut pas le
reecrire/modifier son code, donc le choix du protocole m'est imposé.

--
je suis si magnifique =( / je suis si mysterieuse =(
le mystere est-il magnifique ? =(


Avatar
Laurent Wacrenier
Jean Hoffmann écrit:
j'ai ecrit une appli client pour parler a un serveur, jusque
la, rien de bien palpitant, tout ca se passe en udp, mon probleme
^^^ ^^^^^^^^


Voilà, non ?



je ne suis pas bien sur de comprendre toute la portée comique de la reponse, et
j'en profite pour dire que je n'ai pas ecrit le serveur et ne peut pas le
reecrire/modifier son code, donc le choix du protocole m'est imposé.


Un flushe un flux, pas des datagrammes.



Avatar
Jean Hoffmann
Le 18-06-2004, Laurent Wacrenier a écrit :
Jean Hoffmann écrit:
j'ai ecrit une appli client pour parler a un serveur, jusque
la, rien de bien palpitant, tout ca se passe en udp, mon probleme
^^^ ^^^^^^^^


Voilà, non ?



je ne suis pas bien sur de comprendre toute la portée comique de la reponse, et
j'en profite pour dire que je n'ai pas ecrit le serveur et ne peut pas le
reecrire/modifier son code, donc le choix du protocole m'est imposé.


Un flushe un flux, pas des datagrammes.


oui, je comprends bien ca, mais je me dis que le systeme doit avoir un buffer
quelque part, sinon, je ne comprends pas pourquoi je recois 6 fois le paquet.

--
je suis si magnifique =( / je suis si mysterieuse =(
le mystere est-il magnifique ? =(




Avatar
Jean Hoffmann
Le 18-06-2004, a écrit :
Bonjour,

j'ai ecrit une appli client pour parler a un serveur, jusque la, rien de bien
palpitant, tout ca se passe en udp, mon probleme vient du fait que le serveur
peut fragmenter ce qu'il envoit (qd cela depasse approximativement 1400 octets)
il n'y a aucune regle particuliere (taille, fin ou debut de paquet special, etc)
alors, j'ai decidé de recevoir en boucle ce que le serveur m'envoit tant que je
recois encore qqchose, et c'est la que je me suis rendu compte qu'en fait, je
'recois' 5 ou 6 fois la meme chose.
Ma question est alors simple : comment flusher le buffer de reception ?

je me permets un crosspost sur fclc avec un fu2 sur fcou, a l'epoque ou je
postais encore sur usenet, c'etait largement toléré, desolé si ca a changé
depuis.



j'ai du mal m'expliquer, je post un bout de code :

for(i=0;i<50;i++)
{
response=query_server_debug (address, port, rcon_cmd, buf);
printf("%d:%dn", i, response);
}

en admettant que "query_server_debug (address, port, rcon_cmd, buf);" aille
chercher une reponse, je peux la recevoir 50 fois d'affilée, sans problemes.
j'aimerais vider le buffer de reception (le fait est que le serveur ne m'envoit
pas 50 reponses, bien sur) bien sur je ne teste que la taille, mais les paquets
sont vraiment identiques

--
je suis si magnifique =( / je suis si mysterieuse =(
le mystere est-il magnifique ? =(

Avatar
Manuel Leclerc



j'ai ecrit une appli client pour parler a un serveur,
jusque la, rien de bien palpitant, tout ca se passe en
udp, mon probleme
^^^ ^^^^^^^^


Voilà, non ?



je ne suis pas bien sur de comprendre toute la portée comique
de la reponse, et j'en profite pour dire que je n'ai pas ecrit
le serveur et ne peut pas le reecrire/modifier son code, donc
le choix du protocole m'est imposé.


Excuses moi pour la réponse un peu laconique. UDP n'est pas
un protocole connecté, à la différence de TCP. Les messages
doivent "porter" un protocole applicatif pour gérer les arrivées
en plusieurs exemplaires, les arrivées dans un ordre différent
de celui d'émission, et les "arrivée qui n'arrivent pas".
Ce type de protocole commence généralement par une simple
"numérotation" des messages, c'est un minimum. Si tu ne connais
pas le protocole, tu ne peux rien faire, je pense. Par exemple,
si ça se trouve (je ne connais pas les différentes manières
d'utiliser UDP) peut être qu'il n'y a aucune duplication dans ton
cas mais que le serveur te renvoie des messages parce que tu ne lui
indiques pas que tu les as bien reçus.

--
So before Wine was created, anything which uses a Windows library
was a derivative of Windows?
Yes.

--Josh Triplett



Avatar
Laurent Wacrenier
Jean Hoffmann écrit:
Le 18-06-2004, Laurent Wacrenier a écrit :
Jean Hoffmann écrit:
j'ai ecrit une appli client pour parler a un serveur, jusque
la, rien de bien palpitant, tout ca se passe en udp, mon probleme
^^^ ^^^^^^^^


Voilà, non ?



je ne suis pas bien sur de comprendre toute la portée comique de la reponse, et
j'en profite pour dire que je n'ai pas ecrit le serveur et ne peut pas le
reecrire/modifier son code, donc le choix du protocole m'est imposé.


Un flushe un flux, pas des datagrammes.


oui, je comprends bien ca, mais je me dis que le systeme doit avoir un buffer
quelque part, sinon, je ne comprends pas pourquoi je recois 6 fois le paquet.


On flushe en sortie, pas en entrée. Si vous recevez le paquet 6 fois,
c'est qu'il est envoyé 6 fois ou que le réseau l'a dupliqué.





Avatar
Jean Hoffmann
Le 18-06-2004, Laurent Wacrenier a écrit :
Jean Hoffmann écrit:
Le 18-06-2004, Laurent Wacrenier a écrit :
Jean Hoffmann écrit:
j'ai ecrit une appli client pour parler a un serveur, jusque
la, rien de bien palpitant, tout ca se passe en udp, mon probleme
^^^ ^^^^^^^^


Voilà, non ?



je ne suis pas bien sur de comprendre toute la portée comique de la reponse, et
j'en profite pour dire que je n'ai pas ecrit le serveur et ne peut pas le
reecrire/modifier son code, donc le choix du protocole m'est imposé.


Un flushe un flux, pas des datagrammes.


oui, je comprends bien ca, mais je me dis que le systeme doit avoir un buffer
quelque part, sinon, je ne comprends pas pourquoi je recois 6 fois le paquet.


On flushe en sortie, pas en entrée. Si vous recevez le paquet 6 fois,
c'est qu'il est envoyé 6 fois ou que le réseau l'a dupliqué.


je veux bien, maintenant, qu'est ce que j'ai pu oublié qui fait ce que je decris
dans le follow up de mon propre post ?

--
je suis si magnifique =( / je suis si mysterieuse =(
le mystere est-il magnifique ? =(






Avatar
Manuel Leclerc

On flushe en sortie, pas en entrée. Si vous recevez le
paquet 6 fois, c'est qu'il est envoyé 6 fois ou que le
réseau l'a dupliqué.


je veux bien, maintenant, qu'est ce que j'ai pu oublié qui
fait ce que je decris dans le follow up de mon propre post ?


J'ai connu une certaine version d'une certaine implémentation
d'un certain fournisseur américain de système d'exploitation
(un peu hors sujet, ici, le système) qui renvoyait toujours le
même buffer quand on lisait en mode non-bloquant. Très pénible...

Peut être faudrait-il un peu détailer le code de la fonction
de lecture ?

--
I have systematically eliminated all references to "software",
because some people disagree about what it means.
--Andrew Suffield


1 2