2009-07-06 10 views
0

J'ai besoin d'aide pour comprendre un problème particulier que j'ai lorsque vous utilisez asio. J'ai une application client-serveur, avec un client C++ (en utilisant boost asio) envoyant 2 octets hearbeat (disons, chaque seconde) à un serveur (écrit en Java) (et recevant beaucoup de données).boost asio: 0 octet écrire

le serveur reçoit correctement les 2 octets HeartBeat, mais après que le 'read' du serveur se plaint d'une lecture de 0 octet, et ferme la connexion (ce qui est correct pour une lecture bloquante). Le client imprime cependant toujours qu'il transfère le montant correct.

J'ai expérimenté presque toutes les variantes de la famille de fonctions 'write'. sont tous mis en œuvre en termes de 'write_some' et cela signifie-t-il que ce comportement est attendu?

Je dois faire une erreur dans mon utilisation, fondamentalement, je cherche quelque chose dans asio qui garantit une écriture (au moins un octet). S'il vous plaît aidez-moi à comprendre où je vais mal (et si toute autre information est reqd.) ... un conseil, le plus apprécié! merci!

Répondre

1

S'il s'agit de sockets, vous ne pouvez pas "garantir une écriture"; que se passe-t-il si le réseau est en panne, le câble arraché, le commutateur est en feu ou l'alimentation est coupée dans le monde entier et votre ordinateur est le seul à fonctionner sur batteries? Cela dit, il semble que vous ayez un problème de mise en mémoire tampon/vidage, vérifiez votre code lu pour vous assurer qu'il consomme vraiment toutes les données qui apparaissent.

Une lecture de 0 octet n'est pas une erreur, vérifiez à nouveau ce code, vérifiez les indicateurs d'état d'erreur sur le (s) socket (s), etc. Une lecture peut échouer avec un état "AGAIN", ce qui signifie que vous devriez réessayer.

+0

Salut Déroulez, merci pour votre réponse. Le 'read' est dans le serveur java, et en suivant le code, il semble être comme le classique 'select' suivi d'un 'read' ('blocking'), (je pensais que EAGAIN était seulement si non-bloquant était ensemble) . tous les autres clients java n'ont aucun problème. Je suis un peu confus sur 0 octet lu sur un appel de lecture de blocage «normal» (tous les livres et docs n/w mentionnent lire <= 0 comme une erreur/échec) alors qu'une écriture de blocage peut être courte (et pas tous les octets en une fois), peut-il jamais envoyer une charge utile de 0 tcp? –

+0

read retournant 0 est à peu près une façon standard de dire "l'autre extrémité a fermé la connexion tcp". Vérifiez-le avec, par exemple, un moniteur réseau comme wireshark. – nos

1

strace les applications aux deux extrémités. Il affichera tous les codes d'erreur renvoyés par lu(), écrivez() etc. Utilisez strace -f si l'application est multithread.

L'avantage de cette approche est que toutes les applications - java, C++, python semblent identiques dans une ligne , il est donc facile de détecter les mauvais comportements.

Dans ce cas, il est probable que la connexion tcp se termine (gracieusement).

Questions connexes