Нужно сформировать UDP пакет. Имеет такой вид: ------------------------ . . Ethernet заголовок . ------------------------ . . IPv4 заголовок . ------------------------ . . UDP заголовок . ------------------------ . . Данные . ------------------------ Вопрос: По каким частям пакета считать контрольную сумму UDP пакета (той, что в UDP заголовке) ? Читал про псевдо-заголовок, примерно понял, что это и для чего. Однако, есть несколько источников информации по этому делу, но они в некоторых местах друг другу противоречат. В одном написано, что контрольную сумму считать по псевдо-заголовку, UDP-заголовку и данным, а в другом вообще как-то нелогично написано. Вообщем, не могу чё-то разобраться. Разъясните пожалуйста. Идеальной помощью была бы ссылка на работающий исходник.
http://www.google.ru/search?hl=ru&q=UDP+%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F+%D1%81%D1%83%D0%BC%D0%BC%D0%B0&lr= Первый же линк дает исчерпывающий ответ на твои вопросы
Вообщем я даун, и не знаю, что в интернете имеется такой сервис как www.google.com(ru) и что можно написать "UDP контрольная сумма" в строке поиска. Спасибо, твой пост мне очень помог! Но всё же. Возникло много вопросов, пока вижу только один путь решения - экпериментальный, но это такое мучение. Хотелось бы, чтобы люди которые этим занимались и четко понимают (а такие точно есть) просто отметили, что из следующего списка верно, а что нет. Это же совершенно не сложно. Так я буду четко знать, что вот "тут" ошибки точно нет. Это сильно сократит количество вариантов перебора. Список вопросов по существу: ########################################################## Как я понял, расчет контрольной суммы производится по такому куску памяти: - псевдо-заголовку (12 байт); - за ним идет UDP-заголовок (8 байт); - за ним идут данные (длина, например, Len). Причем если общее количество байт в этом куске памяти нечетное, то нужно добавить в конце один нулевой байт (который не отправляется в сеть) и рассчитать контрольную сумму, примерно так (при нечетном кол-ве байт) crc=checksum((void*)p,12+8+Len+1); p - указатель на начало этого куска памяти. Вопрос 1: Всё я правильно понимаю или в чем-то ошибаюсь? ########################################################## Поле length псевдо-заголовка должно содержать а) Длина UDP-заголовка; б) Длина UDP-заголовка + длина данных; (мне кажется, что это верный вариант) в) Длина псевдо-заголовка + длина UDP-заголовка; г) Длина псевдо-заголовка + длина UDP-заголовка + длина данных; Вопрос 2: Что из этого верно? ########################################################## Вопрос 3: Нужно ли изменять порядок следования байт при заполнении поля length псевдо-заголовка? Т.е. как правильно, Pseudo_header->length=sizeof(UDP_HDR)+Len; или Pseudo_header->length=htons(sizeof(UDP_HDR)+Len); ? ########################################################## И вот представте все эти варианты между собой перебрать. Если учесть ещё такой момент (который лично у меня бывает проявляется), что где-то в чем-то протупил и нужно сначала. УУУ! Ё! Хочется подтвердить хоть какие-то из вариантов (сорри, повторяюсь...).
PINKOD Вопрос 1 - Верно Вопрос 2 - б) Вопрос 3 - Не нужно менять, ты же не в сеть эту длинну отправляешь