Je voulais savoir comment rincez les flux de socket lors de la programmation de la prise en C. J'ai essayé toutes les options - réglage des options TCP_Nodelay code> à l'aide du code suivant-
shutdown(sockfd, SHUT_WR);
5 Réponses :
Faire un peu de recherche sur Google, il ne semble pas qu'il y ait un moyen de rincer un flux de socket explicitement. Vous pouvez définir le TCP_Nodelay, puis il désactivera le TCP Algorithme Nagle . Cela devrait s'assurer que les données sont envoyées immédiatement et n'attendent pas que la mémoire tampon est pleine avant d'envoyer. P>
Avez-vous utilisé Wireshark ou quelque chose pour voir ce qui se passe dans les coulisses lorsque vous définissez TCP_Nodelay? P>
Je n'ai pas utilisé aucun des outils pour vérifier ce qui se passe dans les coulisses. Wat I observed était que les données sont envoyées immédiatement sur le serveur une fois que la connexion de socket se ferme ou le client complète l'exécution.
Et même j'ai constaté qu'il n'y avait pas de moyen explicite de chasser les prises, mais peu de dire qu'ils pourraient le faire en définissant TCP_Nodelay ou en utilisant l'arrêt ()
Sans utiliser de tels outils, vous ne pouvez pas savoir que les données ont été envoyées lorsque la connexion a été fermée.
Vous pouvez désactiver Nagle, mais je ne sais pas un moyen de désactiver les ACK retardés, ce qui pourrait également être le problème.
Vous voudrez peut-être lire La page Ultimate SO_LINGER, ou: pourquoi mon TCP n'est pas fiable , que je pense s'applique à votre situation. P>
appeler envoyer () code> sur une prise TCP à plusieurs reprises n'est pas si rare :) C'est une utilisation normale, je veux dire. Vous avez probablement des problèmes sur le côté serveur, où Server attend certains nombre d'octets et de blocs en attendant.
Pour autant que je sache, JVM TI ne dicte pas de protocole sur le fil excédentaire, vous devrez donc vous proposer votre propre. Définir la structure de l'enregistrement Le client envoie et le serveur s'attend à ce que la longueur de données s'ils varient de la taille. Vous pouvez également implémenter un accusé de réception au niveau de l'application du serveur de retour au client. P>
J'ai complètement traversé l'article. Bien que je n'ai pas pu comprendre la plupart d'entre eux. Je pourrais déterminer que l'auteur tentait de dire-utiliser envoi () puis d'appeler l'arrêt (). Mais que si je dois envoyer les données plusieurs fois? Ce n'est pas possible à droite une fois que l'arrêt () est appelé?
Sur le côté serveur, utilisez une instance de scanner pour lire le flux. Ainsi, lorsque les données sont disponibles sur le flux, la méthode "HASNEXT ()" renvoie true et on lit en utilisant la méthode "Suivant ()". Avons-nous encore besoin de la taille des données envoyées.
Il vaut mieux laisser l'autre côté savoir à quoi s'attendre. La chose est que TCP transfère des données dans des morceaux (paquets IP), qui n'entraînent pas nécessairement avec les données que l'application envoie. Demandez-vous - comment le serveur sait-il quand une partie de données du client se termine et l'autre commence?
En fait tu étais correct. Je faisais une erreur du côté serveur quand j'étais scanner usin. Mon ami m'a suggéré de le remplacer par bufferedreader. Je l'ai remplacé par Bufferedreader pour lire l'octet d'octet par octet. Merci beaucoup pour l'aide.
Socket-Unix-FAQ dit que vous ne pouvez pas chasser les sockets p>
Vous ne pouvez pas affleurer explicitement que la prise que les données sont toujours envoyées aussi rapidement que possible, en tenant compte de l'espace tampon disponible sur le récepteur et de la nécessité d'éviter la congestion du réseau. Réglage TCP_Nodelay permet l'envoi de paquets inférieurs à la taille maximale tandis qu'il y a toujours des remerciements exceptionnels. P>
C'est malheureux, car ce qui est "raisonnable" est discutable. Est-il raisonnable de devoir attendre des dizaines de millisecondes lorsque je sais que j'ai écrit toutes les données à la prise d'une commande et que je souhaite maintenant que le serveur réponde aussi vite que possible?
Utilisez simplement Fdopen. Sous Linux quelque chose est un fichier. par exemple.
FILE *f = fdopen(socketdescriptor, "w+"); . . . n = write(socketdescriptor, "this is a message", 17); fflush(f); ...
Vous devriez mentionner quelle plate-forme vous travaillez sur Windows ou * Nix pour plus de clarté.
Oh désolé d'avoir disparu que fonctionnant sur Linux, pour être spécifique- Ubuntu 9.10
Pouvez-vous poster plus de votre code? Vous vérifiez la valeur de retour de l'envoi?
Ouais je le stocke dans une variable appelée "bytes_sent". Et s'il y a 20 caractères envoyés par le client, la variable indique correctement "20 octets" envoyés. J'imprime les octets envoyés sur l'invite de commande. Une fois que la connexion est fermée, toutes les données envoyées sont imprimées sur le serveur jusqu'à ce que le client soit envoyé.
Les données pourraient être bloquées dans le tampon d'entrée du côté de la réception; Utilisez Wireshark pour vérifier. Vérifiez également que vous définissez
drapeau = 1 code> avant d'appeler
setSockopt () code> ci-dessus.
J'ai essayé d'utiliser Wireshark mais je n'ai pas pu comprendre une activité qui avait la même adresse IP pour la source et la destination. Et aussi, définissez le drapeau = 1.
@sana, quel est le problème que vous essayez de résoudre?
Je mettez en place l'interface JVMTI dans la langue Natvie (C ++) (agent JVMTI). Les données obtenues à partir de l'agent JVMTI (socket client) sont envoyées à un autre processus Java (socket Server). Bien que les données soient imprimées sur la prise du serveur, elle ne se produit qu'après que je quitte la prise du client.