Существуют ли жизнеспособные альтернативы Winsock для C++? Причина, по которой мне это нужно, заключается в том, что необработанные сокеты Winsock ведут себя неправильно (нет, это невозможно исправить, не тратьте время на спрашивание), а WinPCAP может только отслеживать сетевой трафик, а не получать пакеты. Мне нужно что-то, что может принимать полные пакеты, включая любые заголовки IP, UDP, TCP и т. д. Существует ли такая вещь, и если нет, то почему?
Альтернатива Winsock (нет, не WinPCAP)
comment
Я собираюсь тратить свое время, спрашивая: почему это не работает для вас? Если вы собираетесь заявить, что [продукт, который работает для всех остальных] не работает, вам следует потратить хотя бы одно или два предложения в поддержку этого.
- person Thanatos   schedule 16.08.2010
comment
Объяснение заняло бы слишком много времени и вызвало бы больше вопросов.
- person Chroma   schedule 16.08.2010
comment
Вы правы - это обычно приводит к большему количеству вопросов, и в большинстве случаев (особенно когда ОП не объясняет свою ситуацию заранее) это приводит к тому, что мы обнаруживаем, что они неправильно используют [продукт, который работает для всех остальных]. Возьмем, к примеру, почти каждый, я думаю, я нашел ошибку в сообщении GCC. Поэтому я задаю вопрос о потере времени.
- person Thanatos   schedule 16.08.2010
comment
Если ваша реализация Winsock на самом деле сломана, то я боюсь, что вы довольно F'd приятель. Я рекомендовал Boost.Asio, но если WS32 действительно не работает, то все, что его обертывает, тоже будет сломано.
- person Anthony   schedule 16.08.2010
comment
На самом деле я попробую: использование различных параметров функции сокета winsock либо приводит к тому, что мое приложение не получает никаких пакетов (sock_raw, ipproto_raw), либо заставляет все сокеты, которые я создал, получать один и тот же пакет (sock_raw, ipproto_udp), либо работают правильно но не получать заголовки (sock_dgram, ipproto_udp)
- person Chroma   schedule 16.08.2010
Ответы (2)
WinPCAP может только отслеживать сетевой трафик, но не получать пакеты.
Мониторинг сетевого трафика эквивалентен получению пакетов. Это именно то, что делают такие инструменты, как Wireshark: считывают вашу сетевую карту и реконструируют границы пакетов.
Мне нужно что-то, что может получать полные пакеты, включая любые заголовки IP, UDP, TCP и т. д.
Это вполне возможно с помощью Winsock API. Взгляните на функцию WSAIoctl
, в частности опция SIO_RCVALL
- при включении этой опции ВСЕ пакеты, полученные на интерфейсе, будут доставлены в ваш сокет. И это необработанные IP-пакеты, начинающиеся с IP-заголовка.
person
casablanca
schedule
16.08.2010
Нет, мониторинг трафика не эквивалентен получению пакетов, потому что при мониторинге вы просто наблюдаете за разговором других программ, не имея возможности участвовать. Я не хочу получать все пакеты в сети, мне нужны только те, которые я обычно получаю, но мне нужны заголовки.
- person Chroma; 16.08.2010
Не могли бы вы тогда написать функцию, которая сужает все пакеты до тех, которые вам нужны, и передает их остальной части вашей системы?
- person Thanatos; 16.08.2010
@Chroma: необработанные пакеты сами по себе не соответствуют ни одному приложению. Это номер порта в заголовках, который направляет их к нужной программе. Таким образом, у вас есть два варианта: либо получить все необработанные пакеты и отфильтровать их самостоятельно, либо позволить ОС сделать это за вас и потерять заголовки.
- person casablanca; 16.08.2010
Вы можете посмотреть на Boost.Asio. Кроссплатформенная библиотека ввода-вывода C++. Поддержка UDP, TCP и ICMP.
person
Anthony
schedule
16.08.2010
И это позволяет вам получать весь пакет, включая все заголовки и все такое?
- person Chroma; 16.08.2010
Boost.Asio является оберткой для библиотеки сокетов BSD. Поскольку Winsock может это сделать (и Winsock тоже основан на сокетах BSD), тогда Asio может это сделать. Класс basic_socket является оберткой для функции
ioctl
.
- person Anthony; 16.08.2010
Да, boost может гарантировать получение всего пакета. Посмотрите на boost.org/doc/libs/ 1_43_0/doc/html/boost_asio/ссылка/
- person Default; 23.08.2010