Я использую Windows Server 2008 R2 для производственных целей, поэтому для меня не должно быть проблем с использованием функций raw socket. Но вместо этого у меня возникла проблема с получением данных о входящем гнезде RCVALL. Что я делаю:IPv6 Розетки. Не удается получить пакет в SIO_RCVALL. Win2008
m_recv_socket = socket(AF_INET6 , SOCK_RAW , IPPROTO_IPV6),
setsockopt(m_recv_socket, SOL_SOCKET, SO_RCVTIMEO, reinterpret_cast<const char*>(&recv_timeout_ms), sizeof(int));
bind(m_recv_socket, reinterpret_cast<sockaddr *>(&sa), sizeof(sa));
(я привязывая его здесь, чтобы локальный адрес в моей Nic, то есть fe80 :: A077: 5573: 5f: 3ca5)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 также показывает мне последовательность этого потока). Итак, что можно сделать неправильно в этом приемном сокете?
Ни один из них ... Я хочу добавить, что Wireshark доказывает наличие входящих пакетов для fe80 :: a077: 5573: 5f: адрес 3ca5, к которому я привязал этот сокет. Эти входящие пакеты - это те, которые мне интересны. – Zorgiev
Можете ли вы показать код, который устанавливает 'sockaddr', с которым вы связываетесь? И можете ли вы, пожалуйста, обновить свой вопрос фактическим блоком кода, с которым вы компилируете? Не используйте маркеры, чтобы показывать отдельные заявления. –
'sockaddr_in6 sa = {}; \t sa.sin6_family \t = AF_INET6; \t sa.sin6_addr \t = ip_addr; 'ip_addr здесь' in6_addr const & 'переменная. Он установлен на правильный адрес (тот, который я набрал выше). Код большой, поэтому использовать его здесь бесполезно. – Zorgiev