J'essaie de vous assurer que chaque fois que j'appelle la fonction Socket.Send, mon mémoire tampon est envoyé (rincé) sur mon serveur (qui est en utilisant un socket Unix).
de ma compréhension (et de ce que je voir sur ce tableau) juste désactiver l'algo naggle. devrait le faire, mais mon serveur reçoit toujours mes données dans le morceau de 4096 octets (jeu par défaut) ... p>
im en utilisant le code suivant dans Python V2.5.4: P>
self.sck = socket( AF_INET, SOCK_STREAM ) self.sck.setsockopt( IPPROTO_TCP, TCP_NODELAY, 1 ) # That doesn't seems to work... self.sck.connect( ( "127.0.0.1", "12345" ) ) while( 1 ): self.sck.send( "test\n" ) self.sck.send( "" ) # Still trying to flush...
5 Réponses :
TCP ne fournit aucun type de "paquet" garanti à l'autre extrémité. Vous envoyez des données aussi vite que vous pouvez, et TCP est utile de manière utique les données dans autant qu'il peut envoyer à la fois. Votre serveur reçoit des données 4096 octets à la fois, probablement parce que c'est ce qu'il a demandé (dans un TCP est un protocole de flux et vous devrez donc mettre en œuvre une sorte de cadrage de vous-même. Il n'y a pas de limites de message intégrées. P> recv () code> appel). P>
Zeromq ajoute des limites de message intégrées. Cela pourrait être utile pour l'OP.
Il n'y a aucun moyen d'assurer la taille des morceaux de données envoyés. Si vous souhaitez vous assurer que toutes les données que vous souhaitez envoyer sont envoyées, vous pouvez fermer la connexion: note également, que n = socket.send () renvoie le nombre de d'octets envoyés réels. Si vous voulez absolument envoyer toutes les données, vous devez utiliser P> while data:
n = self.sck.send(data)
data = data[n:]
Je vois cependant dans mon cas, je dois avoir une interaction "en temps réel" ... alors quelles sont mes options? Je veux dire comment est-ce que c'est un serveur Telnet le faire, dès que vous appuyez sur Entrée, la commande est envoyée directement, identique pour un client FTP ... J'aimerais reproduire quelque chose de similaire que dans mon cas, je dois envoyer des données à 30fps. .. Avoir le tampon qui calcule jusqu'à ce qu'il soit plein puis être envoyé ou ajoutant des données supplémentaires simplement pour vous assurer que le tampon est poussé ne semble pas être une option pour moi ... alors que puis-je faire?
@Bob McLaury: "Dans mon cas, j'ai besoin d'une interaction" en temps réel "." Vous le faites mal. (1) Rechercher un réseau en temps réel ou quelque chose de similaire ici. Ensuite (2) rechercher UDP. Vous ne pouvez pas utiliser TCP pour cela. Vous devez utiliser UDP.
La seule façon dont j'ai eu une chasse au travail (retour à un client C) était d'utiliser: Le grand avantage est que my_writer_obj par défaut en mode texte, donc plus de traduction d'octets . p> Créer un objet de lecteur n'est pas allé en douceur, mais je n'avais pas besoin d'une rinçage de ce côté. p> p>
Ceci est une vie de vie. À votre santé!
-1 Cette réponse est fausse. Le protocole TCP par conception n'a aucun moyen d'envoyer des données en morceaux. Il ne peut envoyer que le flux de données. Le code de cette réponse est équivalent à celui posté dans la question.
De la page Python3 Sockets: Maintenant, il y a deux séries de verbes à utiliser pour la communication. Vous pouvez utiliser Envoyer et Recv ou vous pouvez transformer votre prise client dans une bête semblable à un fichier et utiliser lecture et écrire. Ce dernier est la façon dont Java présente ses sockets. Je ne vais pas en parler ici, sauf pour vous avertir que vous devez utiliser des prises de poubelle. Ce sont des "fichiers" tamponnés et une erreur commune consiste à écrire quelque chose, puis à lire pour une réponse. Sans affleurance là-bas, vous pouvez attendre pour toujours pour la réponse, car la demande peut toujours être dans votre mémoire tampon de sortie.
Ceci est une question commune sur le protocole TCP. TCP elle-même n'a aucun moyen d'envoyer des données dans des morceaux spécifiques. Il est conçu uniquement pour envoyer un flux de données. Si vous avez besoin de cette fonctionnalité, vous devez la mettre en œuvre vous-même. Par exemple, envoyez vos morceaux dans des lignes séparées ou d'abord envoyer une taille du morceau, puis le morceau lui-même. P>
Dans la plupart des cas, vous n'avez pas besoin de vous soucier de l'algorithme Naggle. Cet algorithme est mieux décrit par le nom TCP_Nodelay. Si vous le désactivez, vous pouvez obtenir des retards plus petits pour de petits morceaux, mais une vitesse inférieure pour de gros morceaux en même temps. P>
in Linux, cela est possible avec un appel à siocoutq fort> look rapide à donc, appliquez ceci est assez facile: < / p> ioctl code>:
Renvoie la quantité de données non définies dans la file d'attente de socket. Le socket> ne doit pas être en état d'écoute, sinon une erreur (EINVAL) est renvoyée.
Siocoutq est défini dans linux / sockios.h code>: p>