2009-06-18 6 views
4

Je fais de la programmation socket depuis de nombreuses années, mais je n'ai jamais manqué un message utilisant TCP - jusqu'à maintenant. J'ai un serveur Java et un client en C - les deux sur le localhost. Ils envoient des messages brefs comme des ficelles, avec quelques retards entre les deux. J'ai un cas particulier où un message n'arrive jamais du côté du client. Il est reproductible, mais étrangement dépendant de la machine.Missed Socket Message

Pour donner plus de détails, je peux déboguer le côté serveur et voir l'envoi suivi du vidage. Je peux joindre au client et passer à travers les appels sélectionnés (en boucle) mais cela ne se manifeste jamais. Quelqu'un a-t-il expérimenté cela et y a-t-il une explication autre qu'une erreur de codage? En d'autres termes, si vous avez une socket connectée et que vous faites une écriture d'un côté et une lecture de l'autre, que peut-il se produire au milieu pour provoquer quelque chose comme ça?

Un autre détail - J'ai utilisé tcpdump sur l'interface de bouclage et je peux voir le message manqué.

+0

Votre client est multithread? Est-il possible qu'un thread séparé soit également select() sur ce message? Aussi, quel système d'exploitation utilisez-vous? –

+0

Je ne pense pas qu'il soit possible de sélectionner un autre thread. C'est sur Linux. Bonne idée cependant - j'ai vérifié avec un compteur. – AdamC

Répondre

1

Enfin - après avoir reniflé un peu plus, j'ai trouvé le problème. Deux messages étaient envoyés avant une lecture (parfois, mais rarement ...) afin qu'ils soient tous les deux lus, mais seul le premier a été traité. C'est pourquoi il semblait que le deuxième message ne soit jamais arrivé. Il a été enterré dans le tampon de réception.

+1

qrdl fait un excellent point. UDP garantit 1 write == 1 read, mais TCP ne le fait pas explicitement (pour permettre un meilleur débit). –

+0

Bon point sur le contrôle de flux - c'est un excellent moyen d'éviter ce genre d'erreur, mais appeler BS sur mon expérience est impoli. Je n'ai presque pas posté la réponse car c'était une erreur tellement stupide pour cette raison, mais je voulais donner à quelqu'un d'autre cette idée là où regarder. – AdamC

4

J'ai vu cela se produire dans les transactions SMTP auparavant. Avez-vous un scanner de virus fonctionnant sur cette machine? Si oui, essayez de l'éteindre et voir si cela fait une différence. Sinon, je suggère d'installer Wireshark afin que vous puissiez jeter un oeil à ce qui se passe réellement.

+0

Il a utilisé tcpdump et a vu le message manquant. Wireshark donne plus de détails mais ne fera pas une grande différence. – bortzmeyer