Несмотря на свое имя, SendStream () НЕ гарантирует отправку всего потока (особенно, если вы используете неблокирующий сокет).Его возвращаемое значение возвращает сколько байтов фактически отправлено.Если за один вызов отправляется поток меньшего размера, вам придется снова вызывать SendStream (), возможно, много раз, чтобы завершить отправку всего потока (такие же проблемы существуют и с SendText ()).
С другой стороны, ReceiveLength () сообщает только, сколько байтов доступно в сокете НА ЭТОМ МОМЕНТЕ.Вероятно, это меньше, чем полный отправляемый поток (аналогично, ReceiveText () может не получить полную отправленную строку либо потому, что он использует ReceiveLength () внутри).
Лучший способ отправить поток (илилюбые произвольные данные в общем) - сначала отправлять размер данных, а затем отправлять фактические данные.Продолжайте вызывать SendBuf / Stream / Text () до тех пор, пока не будет достигнут этот размер (если -1 возвращается неблокирующим сокетом, не вызывая исключение, вы должны ждать, пока событие OnWrite сокета не сработает, прежде чем сокет снова сможет принимать больше данных).На приемном конце сначала прочитайте размер, затем продолжайте чтение, пока не будет достигнут указанный размер.Возможно, вам придется прочитать при множественном запуске события OnRead, прежде чем вы получите все данные.
Перейдите к http://www.deja.com и http://forums.embarcadero.com, чтобы найти группу новостей Borland / CodeGear / Embarcadero/ Архив форума.Я опубликовал пример кода много раз прежде.