私は運用目的で Windows Server 2008 R2 を使用しているため、Raw ソケット機能を利用することは問題ありません。しかし、代わりに、インバウンド RCVALL ソケットでデータを受信する際に問題が発生しました。私は何をやっている:
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 の LINK-Local アドレス、つまり 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 用に変更された同じコードが正しく機能します。上記の呼び出しの戻りコードはすべて OK です。
手がかりを教えてください。タイプ (AF_INET6、SOCK_RAW、IPPROTO_IPV6) のバインドされていない送信ソケットが存在します。IPV6_HDRINCL が設定されています。手動で形成された TCP パケットをそれを介して送信します。Wireshark は、問題なくパスすることを証明しています。次に、受信ソケットにバインドしたアドレスに正確に TCP(RST, ACK) が着信していることがわかります。ただし、データ受信試行中はアプリケーションがブロックされたままです。すべてのチェックサムに問題はありません。そうでない場合、着信パケットに対する応答はありません。SEQ/ACK 番号がこれを証明しているため、この着信パケットは TCP(SYN) 要求への応答であると確信しています (Wireshark もこのストリームのシーケンスを示しています)。では、この受信ソケットに対して何が間違っているのでしょうか?