Je travaille sur un programme C ++ qui utilise la communication TCP entre client et serveur. À un moment donné du programme, il y a une boucle dans laquelle le serveur envoie au client un objet sérialisé, object1, de taille x, et après cela un objet sérialisé, object2, de taille y. Le client a une boucle avec deux appels séquentiels recv () pour recevoir ces objets.

Le problème est que parfois le premier recv () du client reçoit un objet de taille (x + y), c'est-à-dire que le serveur a envoyé les deux objets avant même que le client ne commence à attendre object1. comment peut-on éviter cela?

0
user1767774 17 janv. 2017 à 11:55

2 réponses

Meilleure réponse

Le problème décrit est l'effet de la nature en continu de TCP. Cela signifie que le protocole TCP ne se soucie pas des bordures des messages. Vous devez donc les ajouter.

Une solution possible consiste à ajouter un en-tête avant tout objet envoyé via la connexion. Par exemple:

x <object1> y <object2>

Où x et y sont des nombres de 32 bits. Lorsque vous lisez les données de la connexion, vous lisez d'abord sizeof object, puis l'objet lui-même.

Cette solution est bien meilleure que l'approche d'accusé de réception de message car l'expéditeur n'a pas à attendre avant d'envoyer le deuxième objet.

Une dernière remarque que vous voudrez peut-être savoir: dans le protocole de réseau, vous devez vous soucier de l'ordre des octets des nombres entiers. Vous pouvez voir les détails ici.

2
Marquis of Lorne 17 janv. 2017 à 23:46

Vous pouvez empêcher cela si vous envoyez simplement object2, si le client a bien reçu object1.

Le client répond à votre serveur s'il a obtenu 1 objet avec succès, alors votre serveur peut envoyer l'objet suivant. Vous pouvez le faire en créant des télégrammes que votre client et votre serveur connaissent.

1
Lars Crown 17 janv. 2017 à 09:00