Текущий архив: 2006.07.16;
Скачать: CL | DM;
ВнизWinsock 2, Win98(WinME) и UDP, как отправить свой заголовок? Найти похожие ветки
← →
viman © (2006-03-10 18:18) [0]Здравствуйте!
При реализации трассировщика узлов возникла проблема(под Win98): не могу отправить свой UDP заголовок. Для отправки UDP пакетов я делал следущее — создавал сокет такsocket(AF_INET, SOCK_RAW, IPPROTO_UDP)
Пропуская следующие действия перейду к сути. Далее формировал UDP заголовок, добавлял до заданного размера пакета(к примеру 32) данные, задавал нужный TTL и все это отсылал с помощью sendto. На WinXP(SP2) все отсылалось на ура(под Win2k могу предположить, что тоже должно работать, но не проверял ещё). Потребовалось это же сделать под Win98(WinME). И что я вижу — полностью игнорируется тип задаваемого сокета, т.е. ведет он себя под Win98 совершенно по другому, в отличие от WinXP. Под Win98 при вызове sendto игнорируется мой заголовок — сокет попросту формирует свой UDP заголовок, а передаваемый мной буфер(со включенным моим UDP заголовком) прицепляет как обычные данные. Все — облом, маршрутизатор, на котором истек TTL посылает мне обратно пакет, содержащий IP заголовок(его), ICMP(его), IP(мой, созданный сокетом), UDP(мой, но тоже созданный сокетом). Данные в пакете отбрасываются(а сними и мой "заголовок") — поэтому хранить в них какие либо идентификаторы не получается. А что там на момент отсылки сокет настряпал в заголовках тоже уже не выловишь.
Вопрос — возможно ли под Win98 отослать свой UDP заголовок? Если да, то как?
Кстати, возникнет ли такая же проблема по NT4, в курсе кто?
А то извращения уже надоели, осталось последнее — взять отладчик, дизассемблер и смотреть ws2_32.dll.
Найти причину, да пачтить во время рантайма, но это уже ...
Спасибо.
← →
GanibalLector © (2006-03-10 19:25) [1]SysErrorMessage(WSAGetLastError) смотрел?
← →
viman © (2006-03-10 19:37) [2]А это здесь причем? SysErrorMessage(WSAGetLastError) в каком месте проверять?
При создании сокета конечно стоит проверка, все хорошо, иначе бы и не отсылался пакет. При sendto тоже проверка на ошибки стоит, и тоже все хорошо говорит, иначе бы опять же не отсылался пакет, либо не весь(я ж его смотрю потом - весь был послан).
Все вызовы функций выполняются отлично. Тут что-то в самой реализации WS2_32.dll под Win98 похоже, ведь точно этот же код под XP отлично работает - согласно MSDN.
Вот только что? И с чем это едят?
← →
GanibalLector © (2006-03-10 20:34) [3]на setsockopt! Дело в том,что IP_HDRINCL появился только в W2k и выше. Соответсвенно,на setsockopt скоре всего и будет ошибка.
← →
GanibalLector © (2006-03-10 20:38) [4]И еще,покажи ф-цию формирования CRC. На многих ресурсах ее СПЕЦИАЛЬНО изменяют,дабы толпы ламеров не занимались спуфингом.
← →
viman © (2006-03-10 21:11) [5]Дык я его(IP_HDRINCL) и не пользую совсем :)
Ведь, как известно, "setsockopt ( IP_HDRINCL )", служит для того, чтобы известить сокет, что я сам хочу управлять IP заголовком. Что мне вообщем то и не требуется — все что мне нужно в IP так это управлять TTL, а для этого setsockopt(IP_TTL) отлично работает под всеми Windows. Хотя я думал уже, что может самому все сформировать, да беда одна — как раз эта опция(IP_HDRINCL) поддерживается только начиная с Win2000, это я уж знаю. По крайней мере так в MSDN указано. Вот вопрос и возник.
← →
Alex Konshin © (2006-03-11 11:49) [6]AFAIK SOCK_RAW is not supported on Win9x at all.
← →
viman © (2006-03-11 22:59) [7]Alex Konshin, я бы не говорил так категорично - по крайней мере для ICMP все замечательно работает на RAW и под Win9x, вот проверьте cледущее:
socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)
← →
Alex Konshin © (2006-03-11 23:09) [8]Во всяком случая я помню какая была шумиха, когда MS наконец-то их реализовала в NT. Поэтому ясно, что в Win9x это не было реализовано, по крайней мере тогда.
← →
viman © (2006-03-13 11:19) [9]Alex, какая версия NT имеется ввиду, NT4 или 2000?
Потому как я не смог свой заголовок UDP отправить и под NT4WS+SP6.
У нее выходит такие же проблемы, как у 9x?
Страницы: 1 вся ветка
Текущий архив: 2006.07.16;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.01 c