Je programmment une application C / C ++ Client / Server Sockets. À ce stade, le client se connecte au serveur tous les 50 ms et envoie un message.
Tout semble fonctionner, mais le flux de données n'est pas continu: soudainement, le serveur ne reçoit rien de plus, puis 5 messages à Une fois ... et parfois tout fonctionne ... P>
a une idée de l'origine de cet étrange comportement? p>
Une partie du code: p>
Client: p> serveur: p> modifications: strong>
dans le client et le serveur, mais le problème est toujours là. P> 2.Oasse ces connexions / déconnexions sont très irréfantatifs, mais quand j'essaie d'écrire p> alors, le message est envoyé une seule fois (ou reçu) ... p> J'avais oublié d'appliquer TCP_Nodelay à la prise client du côté serveur. Maintenant ça marche parfaitement!
Je mets les processus dans des threads afin que les sockets soient ouvertes.
Merci à tous :) p> p> 1. J'ai essayé de faire s> p>
3 Réponses :
C'est ce qu'on appelle " Nagle Delay ". Cet algorithme attend sur la pile TCP pour que plus de données arrivent avant d'envoyer quelque chose au réseau jusqu'à ce que le délai d'expiration expire. Vous devez donc modifier le délai d'attente Nagle ( http://fourier.su/index.php?topic=249.0 ) ou désactiver le délai de nagle du tout ( http://www.unixguide.net /network/socketfaq/2.16.shtml ), les données seront envoyées par envoi code> appel.
p>
Je suis toujours fasciné par la connaissance des gens ici. Merci beaucoup. Je vais essayer ça dans un moment :)
Vous pouvez utiliser l'option TCP_Nodelay pour forcer les données immédiatement. P>
Comme d'autres personnes ont déjà répondu aux retards que vous voyez sont dus à TCP intégré algorithme de Nagle , qui peut être désactivé en définissant l'option Je tiens à vous diriger sur le fait que vos communications de socket sont très inefficaces en raison de la connexion et des déconnexes constantes. Chaque client se connecte au serveur il y a le Handshake à trois voies qui a lieu et la connexion Drappe nécessite quatre paquets compléter. Fondamentalement, vous perdez la plupart des avantages de TCP, mais inciteront tous ses inconvénients. P>
Ce serait beaucoup em> plus efficace pour chaque client de conserver une connexion persistante au serveur. tcp_nodelay code> socket. p>
Sélectionnez (2) CODE>, ou même mieux,
Epoll (4) code>
sur Linux ou KQQUEUE ( 2) code>
sur FreeBSD et Mac, sont des cadres très pratiques pour la manipulation IO sur plusieurs prises. P>
Pas seulement la poignée de main et les démarnements, mais chaque fois que vous formez une nouvelle connexion, vous obtenez à travers le départ lent à nouveau i>.
@Klaus, vous devez faire ces changements des deux côtés, pas seulement du client. Comme le serveur ferme chaque connexion après la première lecture. En outre, TCP ne garantit pas une seule écriture à la prise correspond à une seule lecture de l'autre côté. Les deux sont généralement faits dans une boucle. Ensuite, votre protocole d'application doit valider les octets reçus.