0

Я использую Windows Server 2008 R2 для производственных целей, поэтому для меня не должно быть проблем с использованием функций raw socket. Но вместо этого у меня возникла проблема с получением данных о входящем гнезде RCVALL. Что я делаю:IPv6 Розетки. Не удается получить пакет в SIO_RCVALL. Win2008

  1. m_recv_socket = socket(AF_INET6 , SOCK_RAW , IPPROTO_IPV6),
  2. setsockopt(m_recv_socket, SOL_SOCKET, SO_RCVTIMEO, reinterpret_cast<const char*>(&recv_timeout_ms), sizeof(int));
  3. bind(m_recv_socket, reinterpret_cast<sockaddr *>(&sa), sizeof(sa)); (я привязывая его здесь, чтобы локальный адрес в моей Nic, то есть fe80 :: A077: 5573: 5f: 3ca5)
  4. WSAIoctl(m_recv_socket, SIO_RCVALL , &dwBufferInLen, sizeof(dwBufferInLen), &dwBufferLen, sizeof(dwBufferLen), &dwBytesReturned , NULL , NULL); (где dwBufferInLen равен 1)

Когда я пытаюсь восстановить данные в этом сокете, я постоянно получаю WSA_TIMEDOUT и данные не получены. Тем временем Wireshark доказывает, что входящий и исходящий трафик существует на этом интерфейсе. Что не так? Любая помощь, пожалуйста? Тот же код, измененный для использования IPv4, работает правильно. Все коды возврата для вышеуказанных вызовов в порядке.

Позвольте мне дать некоторые подсказки. Существует несвязанный сокет отправки типа (AF_INET6, SOCK_RAW, IPPROTO_IPV6); IPV6_HDRINCL устанавливается. Я отправляю через нее вручную сформированный TCP-пакет. Wireshark доказывает, что он прошел отлично. Затем я вижу его TCP (RST, ACK) именно для адреса, к которому я привязывал приемный сокет. Но приложение остается заблокированным при получении данных. Все контрольные суммы в порядке, иначе не было бы никаких входящих пакетов. Я уверен, что этот входящий пакет является ответом на мой запрос TCP (SYN), потому что номера SEQ/ACK подтверждают это (Wireshark также показывает мне последовательность этого потока). Итак, что можно сделать неправильно в этом приемном сокете?

ответ

0

По the documentation:

В Windows Server 2008 и более ранние версии, установка SIO_RCVALL IOCTL не будет захватывать локальные пакеты, отправленные из сетевого интерфейса. Это включает пакеты, полученные на другом интерфейсе, и перенаправляет сетевой интерфейс, указанный для SIO_RCVALL IOCTL.

Установка этого IOCTL требует права администратора на локальном компьютере.

Действительно ли это относится к вашей ситуации?

+0

Ни один из них ... Я хочу добавить, что Wireshark доказывает наличие входящих пакетов для fe80 :: a077: 5573: 5f: адрес 3ca5, к которому я привязал этот сокет. Эти входящие пакеты - это те, которые мне интересны. – Zorgiev

+0

Можете ли вы показать код, который устанавливает 'sockaddr', с которым вы связываетесь? И можете ли вы, пожалуйста, обновить свой вопрос фактическим блоком кода, с которым вы компилируете? Не используйте маркеры, чтобы показывать отдельные заявления. –

+0

'sockaddr_in6 sa = {}; \t sa.sin6_family \t = AF_INET6; \t sa.sin6_addr \t = ip_addr; 'ip_addr здесь' in6_addr const & 'переменная. Он установлен на правильный адрес (тот, который я набрал выше). Код большой, поэтому использовать его здесь бесполезно. – Zorgiev