![]() |
Модераторы: Snowy, Poseidon, MetalFan |
![]() ![]() ![]() |
|
K0T9I |
|
||||
Новичок Профиль Группа: Участник Сообщений: 44 Регистрация: 20.11.2009 Репутация: нет Всего: 2 |
всем привет, есть структура пакета:
заполнение и отправка пакета:
Я сделал pck.data типа pointer, так как структура и длина данных в различных пакетах могут быть разными. Потом до меня дошло, что отправляется только указатель pck.data, а не сами данные. Как отправить данные функцией SendBuf, учитывая то, что они могут быть разной длины и структуры? |
||||
|
|||||
kami |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 6 Всего: 72 |
Как вариант пример передачи данных по TCP.
Если не использовать этот пример, то - почитайте тему в ссылке, некоторые вопросы прояснятся. И могут разбиваться и склеиваться друг с другом. И не полностью передаваться. Общие принципы передачи: При начале передачи устанавливаем Pos на 0. В каждом событии OnWrite пытаемся передать все данные, начиная от Pos. Увеличиваем Pos на количество реально переданных байт. Когда Pos=длине данных, "убиваем" данные и начинаем пытаться передать следующие. P.S. Заголовок и сами данные передаем "отдельно", они все равно склеятся по дороге. Общие принципы приема (событие OnRead) Забираем полностью приемный буфер сокета. Пока буфер не пуст: - если заголовок не принят, "выбираем" из приемного буфера данные в заголовок, удаляем из приемного буфера обработанные данные. - если буфер не закончился, то - смотрим длину данных из заголовка - создаем буфер для данных. - выбираем из приемного буфера в буфер данных максимально возможное количество данных (Min(длина_приемного_буфера, остаток_до_полного приема_данных) ). - удаляем из приемного буфера обработанные данные. - если данные приняты полностью, то отправляем заголовок и данные "куда надо", после чего считаем, что заголовок и данные не приняты. и на новый виток цикла. Добавлено через 3 минуты и 30 секунд В каком режиме работают сокеты? ctNonBlocking или ctThreadBlocking? |
|||
|
||||
K0T9I |
|
||||||||
Новичок Профиль Группа: Участник Сообщений: 44 Регистрация: 20.11.2009 Репутация: нет Всего: 2 |
это я знаю, делаю так:
про это слышал, но упустил из виду, спасибо что напомнили ![]()
stNonBlocking ctBlocking Это сообщение отредактировал(а) K0T9I - 15.6.2010, 13:50 |
||||||||
|
|||||||||
kami |
|
||||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 6 Всего: 72 |
Зачем? Лишние телодвижения. Все равно в теле цикла работаете с параметром Socket, переданным в обработчик события. А он в любом случае равен одному из Connections[i]. остальное вроде нормально (хотя, честно говоря - смотрел бегло, сегодня некогда). Ну, и возвращаясь к первоначальному вопросу -
отдельно передаем заголовок, отдельно - данные. Все равно по дороге с ними непонятно что произойдет ![]() Как-то так:
|
||||||
|
|||||||
K0T9I |
|
||||
Новичок Профиль Группа: Участник Сообщений: 44 Регистрация: 20.11.2009 Репутация: нет Всего: 2 |
спасибо за ссылку на ваш компонент, нигде не мог найти нормальный пример использования sendbuf/sendstream, везде текстом посылают.
по своему вопросу решил сделать так, хотя скорей всего это костыль:
upd: сделал так, спасибо kami
Это сообщение отредактировал(а) K0T9I - 16.6.2010, 09:37 |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "Delphi: Сети" | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делится вскрытыми компонентами
Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Сети | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |