| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Сети > Размер принимающего буфера TTCPClient |
| Автор: TDelphi 30.9.2010, 23:06 | ||
| Необходимо, используя компонент TCPClient, принять данные (байты, непечатаемые символы т.е. содержимое файла). Если попытаться прочитать бОльшое количество байт, чем есть в буфере, то программа зависнет, в ожидании порции данных. Отсюда вопрос: Как узнать какое количество данных пришло, которое можно прочитать?
|
| Автор: TDelphi 1.10.2010, 13:59 | ||||
При трассировке программа затыкается на этом месте. Если читать через ReceiveBuf частями (например в цикле по 128 байт), то программа застопорится когда в буфере будет меньше данных, чем 128 байт.
Спасибо за новодку, но можно ли узнать размер стандартными средствами компонента? UPD. Что делает команда PeekBuf? |
| Автор: Matematik 1.10.2010, 15:45 | ||
Посмотри исходник, там цикла ожидания нет, только один вызов recv(). Тоже самое что и ReceiveBuf(), разница лишь в том PeekBuf не удаляет данные из буфера сокета PS читать надо так
|
| Автор: TDelphi 1.10.2010, 17:08 | ||
Исходник чего? Поставлю вопрос немного по другому: Почему зависает программа? |
| Автор: Matematik 1.10.2010, 17:30 | ||
Исходник TTCPClient в файле Sockets.pas
Нечему тут зависать. |
| Автор: Alca 1.10.2010, 17:41 | ||||
есть чему
|
| Автор: TDelphi 1.10.2010, 17:44 | ||
Хм, проверил еще раз - действительно не зависает. Спасибо. А какой размер указывать, если изначально неизвестно сколько данных там? Указать в AIntSize 999999 как-то не кошерно. |
| Автор: Alca 1.10.2010, 17:47 | ||||
Ну ты определись |
| Автор: TDelphi 1.10.2010, 18:01 | ||||||
Код имел место зависать, когда была конструкция этого вида:
Так как все таки узнать размер буфера? Может есть сорцы, с реализацией на этом компоненте?
|
| Автор: Matematik 1.10.2010, 19:00 | ||
Добавлено через 3 минуты и 1 секунду Кстати да. Если в буфере сокета нет данных, recv() будет ждать получения. |
| Автор: TDelphi 1.10.2010, 19:39 | ||||
Вооот! А я уже скрин подготовил =) http://ipicture.ru/Gallery/Viewfull/1384414.html UPD. Может это компонент такой несуразный, что не позволяет стандартными средствами узнать кол-во байт? Есть еще мысль, что нужно принимать через событие OnReceive(Sender: TObject; Buf: pchar; var DataLen: Integer); Или получать сколько в буфере, через команду PeekBuf:
Просьба помочь! |
| Автор: Matematik 4.10.2010, 23:05 | ||||
Похоже что не умеет.
Можно, но имхо изврат, во-первых надо иметь свой временный массив (буфер) больший чем данных в сокете, т.к. PeekBuf вернет кол-во записаных в TempBuf байт. Да еще потом придется вызывать ReceiveBuf() чтоб удалить данные из сокета. Получается два раза копировать одно и тоже. А нужно ли знать кол0во байт? Читаешь из сокета кусками, пишешь в стрим. |