我正在使用Windows Server 2008 R2進行生產,所以使用原始套接字功能對我來說一定沒有問題。但是相反,我在接收入站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));
(我在這裏結合它在我的網卡的鏈路本地地址,即FE80 :: A077:5573:5F:3ca5)WSAIoctl(m_recv_socket, SIO_RCVALL , &dwBufferInLen, sizeof(dwBufferInLen), &dwBufferLen, sizeof(dwBufferLen), &dwBytesReturned , NULL , NULL);
(凡dwBufferInLen等於1)
當我嘗試recv這個套接字上的數據時,我經常收到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