![]() |
Модераторы: feodorv |
![]() ![]() ![]() |
|
fire64 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 97 Регистрация: 18.7.2007 Репутация: нет Всего: нет |
Здравствуйте, я написал программу работающую с UDP пакетами, но столкнулся с серьёзной проблемой.
дело в том что пакеты в консоли обрезаются вывод в консоли обрезается если в пакете встречается 00 в хексе виде
|
|||
|
||||
ptr |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 661 Регистрация: 31.5.2006 Где: Новосибирск Репутация: 9 Всего: 14 |
Замени
на
И кстати '\0' вместо "\0". -------------------- Единственный способ определить границы возможного - это выйти за эти границы, в невозможное. Артур Кларк. |
||||
|
|||||
fire64 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 97 Регистрация: 18.7.2007 Репутация: нет Всего: нет |
это конечно хорошо, но всёравно выводится только первая строка пакета
|
|||
|
||||
ptr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 661 Регистрация: 31.5.2006 Где: Новосибирск Репутация: 9 Всего: 14 |
А ты уверен что у тебя в буфере весь пакет?
-------------------- Единственный способ определить границы возможного - это выйти за эти границы, в невозможное. Артур Кларк. |
|||
|
||||
fire64 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 97 Регистрация: 18.7.2007 Репутация: нет Всего: нет |
recvfrom (name_sock, RecvBuf, sizeof(RecvBuf),0,(sockaddr *) &server_addr, &server_addr_size);
а разве функция recvfrom заносит не весь пакет в буфер ? объем буфера у меня конечно больше чем размер пакета |
|||
|
||||
ptr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 661 Регистрация: 31.5.2006 Где: Новосибирск Репутация: 9 Всего: 14 |
Она вообще ничего про твои пакеты не знает. Это сообщение отредактировал(а) ptr - 13.10.2008, 15:49 -------------------- Единственный способ определить границы возможного - это выйти за эти границы, в невозможное. Артур Кларк. |
|||
|
||||
fire64 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 97 Регистрация: 18.7.2007 Репутация: нет Всего: нет |
ptr, не подскажешь как получить полный пакет ?
|
|||
|
||||
ptr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 661 Регистрация: 31.5.2006 Где: Новосибирск Репутация: 9 Всего: 14 |
Размер пакета ты знаешь, количество принятых байт знаешь. Просто собирай пакеты из принятых буферов.
-------------------- Единственный способ определить границы возможного - это выйти за эти границы, в невозможное. Артур Кларк. |
|||
|
||||
Олег2005 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 421 Регистрация: 26.5.2005 Где: Рига Латвия Репутация: 6 Всего: 11 |
Блокирующий recvfrom () возвращает управление в программу только после того, как в сокет прийдет вся UDP-датаграмма.
Стивенс утверждает, что обрезка истинно происходит только в том случае, если буфер recvfrom меньше пришедшей датаграммы. Если выдать recvmsg() на такой датаграмме, то она вернет флаг MSG_TRUNC в соответствующем поле структуры msghdr - но это на некоторых *nix системах. Это сообщение отредактировал(а) Олег2005 - 18.10.2008, 20:41 |
|||
|
||||
J0ker |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 1 Всего: 14 |
UDP пакеты не сегментируются и приходят целиком (или не приходят вообще
![]() также они не объединяются recvfrom извлекает очередную датаграмму и обрезает ее если она больше буфера - остаток теряется. |
|||
|
||||
Олег2005 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 421 Регистрация: 26.5.2005 Где: Рига Латвия Репутация: 6 Всего: 11 |
||||
|
||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Сети | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |