Альтернатива Winsock (нет, не WinPCAP)

Существуют ли жизнеспособные альтернативы Winsock для C++? Причина, по которой мне это нужно, заключается в том, что необработанные сокеты Winsock ведут себя неправильно (нет, это невозможно исправить, не тратьте время на спрашивание), а WinPCAP может только отслеживать сетевой трафик, а не получать пакеты. Мне нужно что-то, что может принимать полные пакеты, включая любые заголовки IP, UDP, TCP и т. д. Существует ли такая вещь, и если нет, то почему?


person Chroma    schedule 16.08.2010    source источник
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
comment
Нет, мониторинг трафика не эквивалентен получению пакетов, потому что при мониторинге вы просто наблюдаете за разговором других программ, не имея возможности участвовать. Я не хочу получать все пакеты в сети, мне нужны только те, которые я обычно получаю, но мне нужны заголовки. - person Chroma; 16.08.2010
comment
Не могли бы вы тогда написать функцию, которая сужает все пакеты до тех, которые вам нужны, и передает их остальной части вашей системы? - person Thanatos; 16.08.2010
comment
@Chroma: необработанные пакеты сами по себе не соответствуют ни одному приложению. Это номер порта в заголовках, который направляет их к нужной программе. Таким образом, у вас есть два варианта: либо получить все необработанные пакеты и отфильтровать их самостоятельно, либо позволить ОС сделать это за вас и потерять заголовки. - person casablanca; 16.08.2010

Вы можете посмотреть на Boost.Asio. Кроссплатформенная библиотека ввода-вывода C++. Поддержка UDP, TCP и ICMP.

person Anthony    schedule 16.08.2010
comment
И это позволяет вам получать весь пакет, включая все заголовки и все такое? - person Chroma; 16.08.2010
comment
Boost.Asio является оберткой для библиотеки сокетов BSD. Поскольку Winsock может это сделать (и Winsock тоже основан на сокетах BSD), тогда Asio может это сделать. Класс basic_socket является оберткой для функции ioctl. - person Anthony; 16.08.2010
comment
Да, boost может гарантировать получение всего пакета. Посмотрите на boost.org/doc/libs/ 1_43_0/doc/html/boost_asio/ссылка/ - person Default; 23.08.2010