Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Сети > Raw socket |
Автор: Alexey68 27.7.2015, 17:06 | ||
Hi All. При попытке отослать пакет на роутер (192.168.0.1), от него приходит ответ: ICMP:Destination Unreachable Message, а если отослать пакет на компьютер (в лок. сети 192.168.0.53), то тишина.... ОС xp sp3. Трафик смотрю Ms network monitor. Программа отрабатывает без ошибки. Вот код (чужой):
Прошу Вашей помощи. |
Автор: feodorv 28.7.2015, 00:22 | ||
Вы, собственно, сформированный отправляемый пакет разбирали по винтику? Сравнивали, например, с тем, что порождает команда
Где проверка remoteHost->h_addrtype на AF_INET (иначе h_length будет не такой, какой Вы её ожидали). Настолько сложно посчитать контрольную сумму? Я не уверен, что и v4hdr->ip_checksum можно оставлять нулевой. Зачем же так жестоко? Код http://forum.sources.ru/index.php?showtopic=236282 взят что-ли? |
Автор: feodorv 28.7.2015, 12:04 | ||||
Для TCP - да. Для UDP - нет. Заметил, что у Вас, не смотря на всестороннее описание TCP заголовка, в IP-заголовке внезапно прописывается ![]()
Ну, тогда держите для UDP:
|
Автор: Alexey68 28.7.2015, 14:56 | ||
Отсутствие твёрдой "базы" даёт о себе знать...) Очень признателен. Извиняюсь, но при запуске: sendto: требуемый адрес для своего контекста неверен. Прописываю существующие адреса: ipHdr->ip_source = inet_addr( "192.168.0.55" ); ipHdr->ip_dest = inet_addr( "192.168.0.1" );//роутер |
Автор: feodorv 28.7.2015, 17:16 | ||||
По-моему, что-то не то с конфигурацией сети. Нельзя ли увидеть результат выполнения команд
|
Автор: Alexey68 28.7.2015, 22:16 | ||
Выслал в лс. |
Автор: feodorv 28.7.2015, 23:07 | ||
Гм. На вид, всё хорошо. Есть ещё вариант, что номер udp_src_port не отвечает конфигурации системы. Если У Вас в предыдущем варианте
|
Автор: Alexey68 28.7.2015, 23:21 | ||
выключен.
в таком варианте нормально работал: udpHdr->udp_src_port = htons( 80 ); udpHdr->udp_dst_port = htons( 80 ); выставлял dest = 23, src = 80 тоже работало... IDE Borland c++ 2007 если необходимо. ... Пробовал на другом компе, результат тот же (xp sp3). Какая у Вас ОС? |
Автор: feodorv 29.7.2015, 10:52 |
Как раз А Вы не могли бы скомпилиться в MSVSC++ и проверить? Добавлено через 1 минуту и 34 секунды Стоп. То есть всё получилось (пусть и с 80-тыми портами)? |
Автор: Alexey68 29.7.2015, 16:07 |
Получалось с "моим" кодом. В VS2008 работает без проблем, только ругается: CharToOemW: невозможно преобразовать параметр 1 из 'char *' в 'LPCWSTR' В борланде компилируется нормально, но ошибка 10049. Проверил в отладчике всё нормально, но при выполнении sendto результат 10049... Из Microsoft Network Monitor 3.4: Udp: SrcPort = HTTP(80), DstPort = Telnet(23), Length = 21 В ответ: Icmp: Destination Unreachable Message, Port Unreachable, 192.168.0.1:23 Так и должно быть (порт не доступен)? p.s. хотел проверить доступность порта. |
Автор: feodorv 29.7.2015, 17:05 | ||||
Отключите UNICODE. Всё равно printf в коде на него не рассчитан.
Где-то в сети я читал про такое. Решения не давалось. Этот порт (UDP 23) на роутере закрыт, вполне всё правильно. У меня тоже самое. Добавлено через 6 минут и 54 секунды У меня вопрос, Вам точно сырой сокет нужен? |
Автор: Alexey68 29.7.2015, 17:48 | ||
На самом деле они открыты, на 23 через телнет заходит, через 80 тоже, попробовал 80, пишет недоступен. Мне необходимо проверить порты без connect'a (без handshake)... |
Автор: feodorv 29.7.2015, 17:57 | ||
Не забывайте, что Вы на эти порты заходите по UDP, не TCP. Как раз UDP-порты закрыты. Что-то вроде https://ru.wikipedia.org/wiki/Nmap? У неё сурсы, кстати, открыты. |
Автор: Alexey68 29.7.2015, 18:13 |
Если я правильно понимаю, то в Вашем примере необходимо заменить udp заголовок на tcp (для отправки полного tcp/ip пакета)? |
Автор: feodorv 30.7.2015, 00:30 | ||
Гм. Идёте в http://nmap.org/dist-old/, скачиваете версию 1.51, её и изучаете. Профит. Не знаю. Не думаю, что сложно. Но Вам же нужно в первую очередь изучить идеологию пассивного сканирования, с этим как? |
Автор: feodorv 30.7.2015, 06:44 | ||||
Только теперь я догадался, почему в Вашем коде стоялоА потому что:
|
Автор: Олег2005 30.7.2015, 17:46 |
Да, такова правда жизни MSDN: https://msdn.microsoft.com/en-us/library/windows/desktop/ms740548%28v=vs.85%29.aspx Там внизу написано, как обойти эту проблему - с помощью LSP. Но это дело требует высочайшей квалификации. Потому сырой сокет применяется только в связке с ICMP. |
Автор: Alexey68 31.7.2015, 00:34 | ||
Ясно, благодарю Вас за помощь. Ещё проблема в том что wifi адаптер не поддерживает неразборчивый режим... Код для темы был взят отсюда: www.binarytides.com/raw-sockets-using-winsock/ (на первой странице я поспешил) |