Comment puis-je explicitement attendre un TCP ACK avant de continuer?

Est-il possible d’obtenir send () d’attendre que toutes les données envoyées aient été acquittées par ACK (ou de renvoyer -1 si le délai d’attente d’un ACK est écoulé), ou existe-t-il un autre mécanisme permettant d’attendre la ACK après le send () mais avant de faire autre chose?

J’utilise l’API de sockets standard Unix Berkeley.

Je sais que je pourrais mettre en œuvre un ACK de couche d’application, mais je préférerais ne pas le faire lorsque l’ACK de TCP répond parfaitement à cet objective.

Malheureusement, l’API standard ne réserve aucun moyen approprié de le faire. Il peut exister un moyen d’interroger la taille / l’utilisation de la fenêtre d’envoi TCP actuelle, mais malheureusement, il est possible qu’elle ne soit pas interrogée par le moyen standard.

Bien sûr, il existe des moyens délicats pour réaliser ce que vous voulez. Par exemple, sous Windows, il est possible de créer un pilote de filtre réseau pour surveiller le trafic au niveau des paquets.

Autant que je sache, il n’y a pas moyen.

De plus, il ne serait pas fiable, le ACK signifie seulement que le kernel a reçu les données, en attendant que le client ou sa machine puissent s’être écrasés. Vous penseriez que le client a reçu les données, mais en réalité, il ne les a jamais traitées.

Je semble avoir trouvé une solution. Au moins sous Linux, si vous définissez SO_SNDBUF sur la valeur 0, il semble attendre chaque transaction avant d’autoriser le transfert suivant. Bien qu’il revienne immédiatement, il ne permet pas à un autre envoi de réussir tant que l’envoi précédent n’a pas été envoyé. Je n’ai pas essayé d’utiliser select (…) pour déterminer si les données ont été envoyées.

Cela fonctionne sur mon kernel Linux 3.8 et je suis convaincu que cela fonctionne ailleurs.

Vous pouvez écrire un wrapper pour send (). J’ai répondu à une question similaire à celle-ci dans un autre fil .