2010-09-17 3 views
0

Je vais écrire un serveur TCP, le client me envoie un message XML, je me demande si en dessous de la condition qui va arriver et comment éviter que:TCP: comment éviter un message chevauchement

1) client envoie <cmd ...></cmd> 2) disjoindre est occupé à faire quelque chose 3) clients envoie <cmd ...></cmd> 4) serveur ne recv() et mettre la chaîne à tampon

est-ce que le tampon soit rempli de <cmd ...></cmd><cmd ...></cmd> ou pire encore <cmd ...></cmd><cmd ... si mon tampon n'est pas grand assez?

Ce que je veux, c'est que la pile TCP divise les messages en les mêmes morceaux que la façon dont les clients les ont envoyés.

Est-ce faisable?

+0

Êtes-vous inquiet au sujet d'un dépassement de tampon? – aaronasterling

+1

C'est exactement ce que TCP fait: assure les données ordonnées, séquencées et fiables transmises par l'expéditeur. http://en.wikipedia.org/wiki/Transmission_Control_Protocol – msw

Répondre

0

Vous écrivez souvent des clients au pluriel: y a-t-il plusieurs clients qui se connectent à votre serveur? Dans ce cas, chaque client devrait utiliser son propre flux TCP et le problème que vous décrivez ne devrait jamais se produire.

Si les différentes commandes sont envoyées à partir d'un seul client, vous devez alors écrire votre code client afin qu'il attende la réponse à une commande avant d'émettre la suivante.

+1

C'est de la foutaise;) Vous avez juste besoin de vous assurer que votre serveur gère correctement le cadrage des messages. TCP est un flux d'octets, chaque lecture peut retourner entre 1 et le nombre total d'octets en attente, tout le code TCP devrait gérer cela. Si vous avez un message plutôt qu'un protocole basé sur les flux sur TCP, vous devez implémenter une forme de tramage de message afin de diviser le flux entrant en messages que vous comprenez. Il n'y a absolument aucun besoin de restreindre le protocole à une séquence stricte de réponse à un seul message. Même si vous restreignez votre client, vous devez traiter les «messages» incomplets. –

+0

Je l'admets. Le deuxième paragraphe est une simplification excessive. Mais le premier paragraphe a répondu à une question importante du PO. –

+0

"Le deuxième paragraphe est une simplification excessive"? Comment? C'est un protocole commun. C'est ainsi - par exemple - HTTP fonctionne. –

4

Ceci est impossible à garantir au niveau TCP, car il ne connaît que les flux. En fonction de l'analyseur XML que vous utilisez, vous devriez pouvoir le nourrir et lui indiquer quand il a un objet complet, en laissant le second <cmd... dans sa mémoire tampon jusqu'à ce qu'il soit également fermé.

+0

Que dites-vous? Étant donné que chaque client a une socket distincte, le scénario décrit ne peut pas se produire. –

+0

J'ai peut-être mal compris la question, mais j'ai supposé que le scénario était un client unique et demandait si un appel à send() correspondait directement à un appel à recv() – Knio

+0

Oui, je pense que c'est exactement ce que demandait le PO. – caf

3

Vous avez besoin d'un protocole de niveau supérieur pour délimiter les limites de message comme vous le souhaitez. Et il y a plenty to choose from, y compris celui que vous inventez vous-même.

+0

En fait, le problème n'est pas un problème de sérialisation des données car il semble que l'OP utilise déjà quelque chose comme XML (XML est l'un des formats proposés de ce lien) le problème est le problème de transport de données Achevée. HTTP est une solution possible (non incluse dans votre lien, en fait la plupart des formats dans ce lien supposent le transport sur HTTP, pas de TCP brut). – slebetman

Questions connexes