![]() |
Модераторы: Snowy, Poseidon, MetalFan |
![]() ![]() ![]() |
|
TDelphi |
|
|||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 29.8.2010 Репутация: нет Всего: нет |
Необходимо, используя компонент TCPClient, принять данные (байты, непечатаемые символы т.е. содержимое файла).
Если попытаться прочитать бОльшое количество байт, чем есть в буфере, то программа зависнет, в ожидании порции данных. Отсюда вопрос: Как узнать какое количество данных пришло, которое можно прочитать?
|
|||
|
||||
Matematik |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1027 Регистрация: 11.3.2006 Репутация: 24 Всего: 50 |
||||
|
||||
TDelphi |
|
||||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 29.8.2010 Репутация: нет Всего: нет |
При трассировке программа затыкается на этом месте. Если читать через ReceiveBuf частями (например в цикле по 128 байт), то программа застопорится когда в буфере будет меньше данных, чем 128 байт.
Спасибо за новодку, но можно ли узнать размер стандартными средствами компонента? UPD. Что делает команда PeekBuf? Это сообщение отредактировал(а) TDelphi - 1.10.2010, 15:10 |
||||
|
|||||
Matematik |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1027 Регистрация: 11.3.2006 Репутация: 24 Всего: 50 |
Посмотри исходник, там цикла ожидания нет, только один вызов recv(). Тоже самое что и ReceiveBuf(), разница лишь в том PeekBuf не удаляет данные из буфера сокета PS читать надо так
Это сообщение отредактировал(а) Matematik - 1.10.2010, 15:56 |
|||
|
||||
TDelphi |
|
|||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 29.8.2010 Репутация: нет Всего: нет |
Исходник чего? Поставлю вопрос немного по другому: Почему зависает программа? |
|||
|
||||
Matematik |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1027 Регистрация: 11.3.2006 Репутация: 24 Всего: 50 |
Исходник TTCPClient в файле Sockets.pas
Нечему тут зависать. |
|||
|
||||
Alca |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 1 Всего: 50 |
есть чему
|
||||
|
|||||
TDelphi |
|
|||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 29.8.2010 Репутация: нет Всего: нет |
Хм, проверил еще раз - действительно не зависает. Спасибо. А какой размер указывать, если изначально неизвестно сколько данных там? Указать в AIntSize 999999 как-то не кошерно. |
|||
|
||||
Alca |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 1 Всего: 50 |
Ну ты определись |
||||
|
|||||
TDelphi |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 29.8.2010 Репутация: нет Всего: нет |
Код имел место зависать, когда была конструкция этого вида:
Так как все таки узнать размер буфера? Может есть сорцы, с реализацией на этом компоненте?
Это сообщение отредактировал(а) TDelphi - 1.10.2010, 18:07 |
||||||
|
|||||||
Matematik |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1027 Регистрация: 11.3.2006 Репутация: 24 Всего: 50 |
Добавлено через 3 минуты и 1 секунду Кстати да. Если в буфере сокета нет данных, recv() будет ждать получения. |
|||
|
||||
TDelphi |
|
||||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 29.8.2010 Репутация: нет Всего: нет |
Вооот! А я уже скрин подготовил =) ![]() UPD. Может это компонент такой несуразный, что не позволяет стандартными средствами узнать кол-во байт? Есть еще мысль, что нужно принимать через событие OnReceive(Sender: TObject; Buf: pchar; var DataLen: Integer); Или получать сколько в буфере, через команду PeekBuf:
Просьба помочь! Это сообщение отредактировал(а) TDelphi - 1.10.2010, 20:46 |
||||
|
|||||
Matematik |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1027 Регистрация: 11.3.2006 Репутация: 24 Всего: 50 |
Похоже что не умеет.
Можно, но имхо изврат, во-первых надо иметь свой временный массив (буфер) больший чем данных в сокете, т.к. PeekBuf вернет кол-во записаных в TempBuf байт. Да еще потом придется вызывать ReceiveBuf() чтоб удалить данные из сокета. Получается два раза копировать одно и тоже. А нужно ли знать кол0во байт? Читаешь из сокета кусками, пишешь в стрим. Это сообщение отредактировал(а) Matematik - 4.10.2010, 23:06 |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "Delphi: Сети" | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делится вскрытыми компонентами
Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Сети | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |