Rinçage des stream de socket dans la programmation du socket C

Je voulais savoir comment vider les stream de socket tout en effectuant la programmation de socket en C. J’ai essayé toutes les options – paramétrer TCP_NODELAY utilisant le TCP_NODELAY suivant –

 setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, (char *) &flag, sizeof(int)); 

Remarque: tous les flag et sockfd sont déclarés correctement.

J’ai utilisé cette fonction à la fois avant send( ) et après send() mais cela ne faisait aucune différence.

De plus, quelqu’un a suggéré d’utiliser shutdown() après chaque send() mais cela ne fonctionne que dans un cas. Lorsque je l’utilise pour envoyer du texte à nouveau, cela ne fonctionne pas. En fait, la connexion est fermée après l’utilisation de shutdown() .

 shutdown(sockfd, SHUT_WR); 

Quelqu’un peut-il aider à cet égard?

Je voulais append que le serveur est un socket Java et le client est un socket C. Le socket C implémente l’interface JVMTI et envoie les informations au socket Java.

Vous voudrez peut-être lire la page ultime de SO_LINGER ou: pourquoi mon tcp n’est-il pas fiable , ce qui, à mon avis, s’applique à votre situation.

Modifier:

Appeler send() sur un socket TCP à plusieurs resockets n’est pas si rare 🙂 C’est un usage normal, je veux dire. Vous avez probablement des problèmes côté serveur, où le serveur attend un certain nombre d’octets et de blocs en attente.
Pour autant que je sache, JVM TI ne dicte pas de protocole over-the-wire, vous devrez donc créer votre propre protocole. Définissez la structure de l’enregistrement envoyé par le client et le serveur attendu, mettez-y la longueur des données si la taille varie Vous pouvez également implémenter un acquittement au niveau de l’application depuis le serveur vers le client.

En faisant quelques recherches sur Google, il ne semble pas y avoir de moyen de vider explicitement un stream de socket. Vous pouvez définir TCP_NODELAY pour ensuite désactiver l’ algorithme TCP Nagle . Cela devrait vous assurer que les données sont envoyées immédiatement et ne pas attendre que la mémoire tampon soit pleine avant de les envoyer.

Avez-vous utilisé Wirehark ou quelque chose pour voir ce qui se passe dans les coulisses lorsque vous définissez TCP_NODELAY?

utilisez simplement fdopen. Sous Linux, tout est fichier. par exemple.

 FILE *f = fdopen(socketdescriptor, "w+"); . . . n = write(socketdescriptor, "this is a message", 17); fflush(f); ... 

Vous ne pouvez pas vider explicitement en tant que socket car les données sont toujours envoyées le plus rapidement possible, en tenant compte de l’espace de mémoire tampon disponible sur le récepteur et de la nécessité d’éviter la congestion du réseau. La définition de TCP_NODELAY autorise l’envoi de paquets d’une taille inférieure à la taille maximale tant qu’il y a encore des accusés de réception.

socket-unix-faq dit que vous ne pouvez pas vider les sockets