Здравствуйте!
При реализации трассировщика узлов возникла проблема(под 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 заголовок? Если да, то как?
А то извращения уже надоели, осталось последнее — взять отладчик, дизассемблер и смотреть ws2_32.dll.
Найти причину, да пачтить во время рантайма, но это уже ...
Спасибо.
Re: Winsock 2, Win98(WinME) и UDP, как отправить свой заголо
Здравствуйте, vimans, Вы писали:
V> При реализации трассировщика узлов возникла проблема(под Win98): не могу отправить свой UDP заголовок. Для отправки UDP пакетов я делал следущее — создавал сокет так
socket(AF_INET, SOCK_RAW, IPPROTO_UDP)
V> Пропуская следующие действия перейду к сути. Далее формировал UDP заголовок, добавлял до заданного размера пакета(к примеру 32) данные, задавал нужный TTL и все это отсылал с помощью sendto. На WinXP(SP2) все отсылалось на ура(под Win2k могу предположить, что тоже должно работать, но не проверял ещё). Потребовалось это же сделать под Win98(WinME). И что я вижу — полностью игнорируется тип задаваемого сокета, т.е. ведет он себя под Win98 совершенно по другому, в отличие от WinXP. Под Win98 при вызове sendto игнорируется мой заголовок — сокет попросту формирует свой UDP заголовок, а передаваемый мной буфер(со включенным моим UDP заголовком) прицепляет как обычные данные. Все — облом, маршрутизатор, на котором истек TTL посылает мне обратно пакет, содержащий IP заголовок(его), ICMP(его), IP(мой, созданный сокетом), UDP(мой, но тоже созданный сокетом). Данные в пакете отбрасываются(а сними и мой "заголовок") — поэтому хранить в них какие либо идентификаторы не получается. А что там на момент отсылки сокет настряпал в заголовках тоже уже не выловишь. V> Вопрос — возможно ли под Win98 отослать свой UDP заголовок? Если да, то как? V>А то извращения уже надоели, осталось последнее — взять отладчик, дизассемблер и смотреть ws2_32.dll. V>Найти причину, да пачтить во время рантайма, но это уже ...
Насколько я помню, для 9x-линейки надо было отдельно ставить Windows Sockets 2.
И я не могу гарантировать, что WS2-провайдер под Win9x даст тебе изменять setsockopt ( IP_HDRINCL )
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Signed, [TSS] /SDL/
Re: Winsock 2, Win98(WinME) и UDP, как отправить свой заголо
Windows Sockets 2 начал поставляться с 98, вот под 95 действительно надо качать апдейт с MS, но под 98 и далее, он есть.
А по поводу "setsockopt ( IP_HDRINCL )", так это чтобы известить, что я сам хочу управлять IP заголовком. Что мне вообщем то и не требуется — все что мне нужно в IP так это управлять TTL, а для этого setsockopt(IP_TTL) отлично работает под всеми Windows. Хотя я думал уже, что может самому все сформировать, да беда одна — как раз эта опция(IP_HDRINCL) поддерживается только начиная с Win2000. По крайней мере так в MSDN указано. Вот вопрос и возник.
Re: Winsock 2, Win98(WinME) и UDP, как отправить свой заголо
на сколько я помню, в windows нет поддержки RAW сокетов для протокола UDP, только IPPROTO_IP.
Попробуй заменить протокол при создании сокета.
V> Вопрос — возможно ли под Win98 отослать свой UDP заголовок? Если да, то как?
Вот уж чего не скажу.. того не скажу, для меня эти операционки умерли ещё раньше чем для MS.
V>А то извращения уже надоели, осталось последнее — взять отладчик, дизассемблер и смотреть ws2_32.dll. V>Найти причину, да пачтить во время рантайма, но это уже ...
В данном случае, скорее всего, в ws2_32.dll толку мало )
Нет ничего невозможного..
Re[2]: Winsock 2, Win98(WinME) и UDP, как отправить свой заг
Здравствуйте, butcher, Вы писали:
B>"на сколько я помню, в windows нет поддержки RAW сокетов для протокола UDP"
тогда почему на XP все работает именно так? Я указываю, что хочу пересылать UDP, а сокет сам формирует IP, причем правильно все заносит в поле ip.protocol = IPROTO_UDP (вроде так?). И прицепляет мой UDP к своему IP. Никаих лишних дейтвий. Если заменить протокол, то что поставить? IPPROTO_IP? Фигня, извиняюсь, получается под 98, пробовал — в поле ip.protocol пусто(или же еще что-то), НО НЕ UDP(IPROTO_UDP = 17). А мой UDP пакет прицепляеется значит простыми данными, это уже не UDP протокол... Тогда вопрос — что поставить?
B>"Вот уж чего не скажу.. того не скажу, для меня эти операционки умерли ещё раньше чем для MS"
Я б тоже не задумываяь закопал бы(впрочем я так давно уже и сделал), но есть еще люди, есть. Совместимость, понимаете ли...
B>"В данном случае, скорее всего, в ws2_32.dll толку мало"
А на каком тогда уровне идет построение UDP пакета, в ядре что ли? По-моему самое место здесь или нет? Есть конечно ещё ws2help.dll. И ws2_32.dll оттуда несколько функций импортирует, но я не думаю что дальше что-то есть.
Re[3]: Winsock 2, Win98(WinME) и UDP, как отправить свой заг
Здравствуйте, vimans, Вы писали:
V>Здравствуйте, butcher, Вы писали:
B>>"на сколько я помню, в windows нет поддержки RAW сокетов для протокола UDP" V>тогда почему на XP все работает именно так? Я указываю, что хочу пересылать UDP, а сокет сам формирует IP, причем правильно все заносит в поле ip.protocol = IPROTO_UDP (вроде так?). И прицепляет мой UDP к своему IP. Никаих лишних дейтвий.
работают только IPPROTO_ICMP. Как вариант, использовать библиотеки типа WinPCAP.
V>Если заменить протокол, то что поставить? IPPROTO_IP? Фигня, извиняюсь, получается под 98, пробовал — в поле ip.protocol пусто(или же еще что-то), НО НЕ UDP(IPROTO_UDP = 17). А мой UDP пакет прицепляеется значит простыми данными, это уже не UDP протокол... Тогда вопрос — что поставить?
При использовании IPPROTO_IP, нужно формировать IP пакет, но если вариант с IPPROTO_UDP работает, то это ни к чему..
Нет ничего невозможного..
Re[4]: Winsock 2, Win98(WinME) и UDP, как отправить свой заг
Да... Практика частенько оказыватся лучше теории — табличка из статьи "Сниффер: щит и мечь" устарела уже и довольно сильно. Чего уж там, когда там максимум win2000(и указано, что божет быть и выше) рассматривается. А где XP,2003? Неужели и под 2000 не работает? А ещё и под NT4 хотелось бы... Ну, блин, микросовт, действительно маленькое, слабенькое программное обеспечение, подстава однако... Под XP уж точно UDP на сырых работает, но это не радует, если только под XP
"B>При использовании IPPROTO_IP, нужно формировать IP пакет,"
Это в любом случае не подходит — затыка в win98, а под ней уж точно IP напрямую нельзя сформировать — опция IP_HDRINCL(что-то типа этого) неизвестна этой винде вместе с сокетами(хоть вроде и версии 2) — поразительная несовместимость даже на программном уровне у одного производителя...
"Как вариант, использовать библиотеки типа WinPCAP"
в данном случае это не подходит, о библиотеке я знаю, но по определенным соображениям не могу ее применять, да и другие тоже(если существуют).
В общем, конечно, очень хочеться услышать хоть какие-то практические рекомендации. Или диагноз "невозможно", но от того, кто действительно по своему опыту знает, а не только через MSDN мир узнает(хотя без него тоже никак).
Re[5]: Winsock 2, Win98(WinME) и UDP, как отправить свой заг
Похоже никто таких проблем практически не испытывал.
Проверил работу RAW UDP на NT4 и в итоге тоже не смог свой заголовок UDP отправить(под NT4WS+SP6).
У нее выходит такие же проблемы, как у 9x? Ничего себе каша...
Re[6]: Winsock 2, Win98(WinME) и UDP, как отправить свой заг
От:
Аноним
Дата:
13.03.06 10:06
Оценка:
Здравствуйте, vimans, Вы писали:
V>Похоже никто таких проблем практически не испытывал. V>Проверил работу RAW UDP на NT4 и в итоге тоже не смог свой заголовок UDP отправить(под NT4WS+SP6). V>У нее выходит такие же проблемы, как у 9x? Ничего себе каша...
Вот и выходит, что лучший выход это тот что butcher предложил. А то ты в этой каше будешь еще долго вариться имхо. Пробуй winpcap или другие приблуды, например WinpkFilter с ntkernel.com.
C чего кстати такие ограничения то?
Re[7]: Winsock 2, Win98(WinME) и UDP, как отправить свой заг
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, vimans, Вы писали:
V>>Похоже никто таких проблем практически не испытывал. V>>Проверил работу RAW UDP на NT4 и в итоге тоже не смог свой заголовок UDP отправить(под NT4WS+SP6). V>>У нее выходит такие же проблемы, как у 9x? Ничего себе каша...
А>Вот и выходит, что лучший выход это тот что butcher предложил. А то ты в этой каше будешь еще долго вариться имхо. Пробуй winpcap или другие приблуды, например WinpkFilter с ntkernel.com. А>C чего кстати такие ограничения то?
Так с ограничениями все просто — заказ и требования, чтоб без сторонних пакетов. Оно и понятно — кому охота чьи-то dll ещё таскать...
Re[8]: Winsock 2, Win98(WinME) и UDP, как отправить свой заг
От:
Аноним
Дата:
30.03.06 06:45
Оценка:
Здравствуйте, vimans, Вы писали:
V>Так с ограничениями все просто — заказ и требования, чтоб без сторонних пакетов. Оно и понятно — кому охота чьи-то dll ещё таскать...
Ну и отлично. Скажи заказчику , что если без посторонних пакетов то нужно писать что-то своё на уровне ядра опер системы. (так как средсвами api под всю линейку опер систем задача не решаема). Это удорожает разработку на нехилую тучу бабок и определенное к-во времени.
У закакзчика три варианта.
1. Дадут бабла.
2. Не дадут бабла но согласятся на применение сторонних средств.
3. Попробуют найти другого программиста