2010-11-10 16 views
3

J'ai donc un TClientSocket qui doit recevoir plus de 10 Ko de données dans un événement OnRead. Mais lorsque l'événement est déclenché, il ne reçoit que 8 Ko de données, puis l'événement se déclenche à nouveau avec le reste des données.Pourquoi l'événement TClientSocket.OnRead se déclenche-t-il deux fois pour un seul serveur?

Pourquoi cela se produit-il?

+0

C'est la raison pour laquelle il y a des clients bloquants qui gèrent cela pour vous, comme Indy ou Synapse - si le client attend 10kb, il peut lire 10 en un seul appel. La bibliothèque mettra les pièces ensemble. (Mais cela peut bloquer, donc cela fonctionne mieux dans un fil). – mjn

Répondre

12

Parce que TCP est un protocole de flux, pas de message. Vous devez recevoir ce que vous avez reçu, le fusionner en un flux de données, puis analyser le flux en fonction du protocole utilisé.

+1

Exactement. Lorsque vous utilisez TCP, vous obtenez uniquement un flux d'octets. Un seul envoi peut être divisé en plusieurs paquets, et plusieurs envois peuvent être fusionnés en un seul paquet. – CodesInChaos

+0

Merci. C'est ce que j'ai en tête de faire. – zoomz

2

Vous devez écrire un protocole convenu entre le client et le serveur qui signalera la fin du message afin d'analyser le flux pour terminer les messages.

+0

Signaler la fin du message. Comment j'ai oublié ça? Merci. – zoomz