2010-11-10 2 views
3

Итак, у меня есть TClientSocket, который должен получать более 10 Кбайт данных в одном событии OnRead. Но когда событие запускается, оно получает только 8 Кбайт данных, затем событие снова срабатывает с остальными данными.Почему событие TClientSocket.OnRead срабатывает два раза для отправки одного сервера

Почему это происходит?

+0

Именно поэтому блокируются клиенты, которые обрабатывают это для вас, например, Indy или Synapse - если клиент ожидает 10kb, он может читать 10 за один вызов. Библиотека объединит части. (Но это может блокировать, поэтому лучше всего работает в потоке). – mjn

ответ

12

Поскольку TCP - это протокол потока, а не на основе сообщений. Вы должны получать все, что было отправлено, объединить его в один поток данных, а затем проанализировать поток в соответствии с используемым протоколом.

+1

Точно. Когда вы используете TCP, вы получаете поток байтов. Одна отправка может быть разделена на несколько пакетов, и несколько отправок могут быть объединены в один пакет. – CodesInChaos

+0

Спасибо. Это то, что я имею в виду. – zoomz

2

Вам необходимо написать согласованный с сервером протокол, который будет сигнализировать о завершении сообщения nad, чтобы выполнить синтаксический анализ потоковой передачи для завершения сообщений.

+0

Сигнал в конце сообщения. Как я это забыл? Благодарю. – zoomz