Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Delphi: Сети > Отправка данных методом SendBuf |
Автор: K0T9I 15.6.2010, 11:03 | ||||
всем привет, есть структура пакета:
заполнение и отправка пакета:
Я сделал pck.data типа pointer, так как структура и длина данных в различных пакетах могут быть разными. Потом до меня дошло, что отправляется только указатель pck.data, а не сами данные. Как отправить данные функцией SendBuf, учитывая то, что они могут быть разной длины и структуры? |
Автор: kami 15.6.2010, 12:39 |
Как вариант http://forum.vingrad.ru/index.php?showtopic=290376&view=findpost&p=2090440. Если не использовать этот пример, то - почитайте тему в ссылке, некоторые вопросы прояснятся. И могут разбиваться и склеиваться друг с другом. И не полностью передаваться. Общие принципы передачи: При начале передачи устанавливаем Pos на 0. В каждом событии OnWrite пытаемся передать все данные, начиная от Pos. Увеличиваем Pos на количество реально переданных байт. Когда Pos=длине данных, "убиваем" данные и начинаем пытаться передать следующие. P.S. Заголовок и сами данные передаем "отдельно", они все равно склеятся по дороге. Общие принципы приема (событие OnRead) Забираем полностью приемный буфер сокета. Пока буфер не пуст: - если заголовок не принят, "выбираем" из приемного буфера данные в заголовок, удаляем из приемного буфера обработанные данные. - если буфер не закончился, то - смотрим длину данных из заголовка - создаем буфер для данных. - выбираем из приемного буфера в буфер данных максимально возможное количество данных (Min(длина_приемного_буфера, остаток_до_полного приема_данных) ). - удаляем из приемного буфера обработанные данные. - если данные приняты полностью, то отправляем заголовок и данные "куда надо", после чего считаем, что заголовок и данные не приняты. и на новый виток цикла. Добавлено через 3 минуты и 30 секунд В каком режиме работают сокеты? ctNonBlocking или ctThreadBlocking? |
Автор: K0T9I 15.6.2010, 13:39 | ||||||||
это я знаю, делаю так:
про это слышал, но упустил из виду, спасибо что напомнили ![]()
stNonBlocking ctBlocking |
Автор: K0T9I 15.6.2010, 18:07 | ||||
спасибо за ссылку на ваш компонент, нигде не мог найти нормальный пример использования sendbuf/sendstream, везде текстом посылают. по своему вопросу решил сделать так, хотя скорей всего это костыль:
upd: сделал так, спасибо kami
|