![]() |
Модераторы: feodorv |
![]() ![]() ![]() |
|
wondertalik |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 19.3.2012 Репутация: нет Всего: нет |
Портирую код tracerudp с линукс под виндоус. По сути это упрощенная утилита traceroute. Создаются два сокета, один для отправки udp пакета, второй для получения icmp. Пакет отправляется на указанный узел, узел отвечает icmp сообщением. А принять это сообщение не могу. recvfrom в packet_ok возвращает -1. Где моя ошибка. Кто может подсказать? Использую visual studio 2010.
|
|||
|
||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 10 Всего: 45 |
Добавлено @ 17:34 WSAGetLastError вызывали? Отправка/получение данных по сырым сокетам в Виндах возможна только из под администратора. И то говорят, что в седьмых виндах и это зарубили (сам я не пробовал)... Это сообщение отредактировал(а) feodorv - 17.5.2012, 17:34 -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
wondertalik |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 19.3.2012 Репутация: нет Всего: нет |
возвращает -2, код 10022(WSAEINVAL) - http://msdn.microsoft.com/en-us/library/wi...0(v=vs.85).aspx Это сообщение отредактировал(а) wondertalik - 17.5.2012, 21:07 |
|||
|
||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 10 Всего: 45 |
-1??? Не знаю точно, в чём тут дело, но, судя по всему, не нравится сокет. Сокет нужно править с помощью WSAIoctl( ... SIO_RCVALL ... ) (что не так просто, так как требует привязки сырого сокета к интерфейсу). Кроме того, в приведённом коде select проверяется на возвращаемое значение SOCKET_ERROR, а на 0 не проверяется (для существующего кода без правки сокета select всегда будет возвращать 0 - ICMP пакетов нет)))). BSD-сокеты хороши в Юниксе, в Виндах лучше пользоваться родным WinSock API и неблокируемыми сокетами. И вот это работает:
Это сообщение отредактировал(а) feodorv - 17.5.2012, 23:33 -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
wondertalik |
|
||||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 19.3.2012 Репутация: нет Всего: нет |
Может я чего-то не понимаю?
recvfrom возвращает -1 (n). Это сообщение отредактировал(а) wondertalik - 17.5.2012, 23:55 |
||||
|
|||||
feodorv |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 10 Всего: 45 |
Начинаем с 0... Добавлено @ 00:15 Это всё до фора нужно делать... Добавлено через 5 минут И даже вне packet_ok... Добавлено через 7 минут и 53 секунды
Поскольку событие одно, то можно просто
Это сообщение отредактировал(а) feodorv - 18.5.2012, 00:15 -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||
|
|||||
wondertalik |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 19.3.2012 Репутация: нет Всего: нет |
Таймаут 1с. В течении 2 сек возвращается :
Где же подвох? Уже смотрел и сюда: http://msdn.microsoft.com/en-us/library/wi...9(v=vs.85).aspx
вынес в main. Это сообщение отредактировал(а) wondertalik - 18.5.2012, 01:42 |
||||||
|
|||||||
feodorv |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 10 Всего: 45 |
WSAWaitForMultipleEvents просто завершается с WSA_WAIT_TIMEOUT (код ошибки при этом наследуется, то есть не правится). Лучше так:
Вот не знаю ![]()
Это сообщение отредактировал(а) feodorv - 16.9.2013, 04:39 -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||
|
|||||
wondertalik |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 19.3.2012 Репутация: нет Всего: нет |
А почему первый параметр 1, а не сокет rawsc? |
|||
|
||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 10 Всего: 45 |
Потому что первый параметр - число событий, которых мы ожидаем. В явном виде сокета здесь нет, но есть событие, ассоциированное с сокетом ![]() -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
wondertalik |
|
||||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 19.3.2012 Репутация: нет Всего: нет |
Я благодарен Вам за помощь. Очень помогаете. Надеюсь и дальше сможете мне помочь, дабы добить до конца тему. И так, благодаря ВАм, пакеты icmp успешно принимаются. Вот код который получился на данный момент:
Теперь касательно разбора пакета. Допустим я хочу вывести протокол с айпи заголовка hip
Выводит 168, а должен 17(IPPROTO_UDP) . icmp->icmp_type, icmp->icmp_code выводятся с верными значениями. Причем, снифер WireShark, показывает, что протокол UDP(17). Это сообщение отредактировал(а) wondertalik - 18.5.2012, 17:45 |
||||
|
|||||
feodorv |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 10 Всего: 45 |
Где Вы взяли такое описание IP-заголовка??? Должно быть:
Вообще, для начала было бы неплохо контролировать то, что пришло по сокету:
И уже тут смотреть, 17 там или нет ![]() -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||
|
|||||
wondertalik |
|
||||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 19.3.2012 Репутация: нет Всего: нет |
[QUOTE=feodorv,18.5.2012, 21:12]
Действительно не углядел. ![]()
feodorv, огромное спасибо Вам за помощь. С такими успехами у меня все меньше желания прогить под Виндоус. Быть может я и не прав))). Это сообщение отредактировал(а) wondertalik - 23.5.2012, 19:16 |
||||
|
|||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 10 Всего: 45 |
Это вопрос привычки))) И Вы ещё сервисов не писали))) -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
wondertalik |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 19.3.2012 Репутация: нет Всего: нет |
Код выше компилируется в визуал студио 2010 в режиме Debug. В release упорно не хочет. Выдает варнинги и ероры:
Как быть? |
|||
|
||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Сети | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |