2013-06-12 3 views
1

ASIO-BOOST 라이브러리를 사용하여 ICMPv6 에코 응답을 수신하면 Windows 7에서 이상한 문제가 발생합니다. 수신 된 데이터에 IP 헤더가 없으며 ICMP 헤더와 페이로드 만 있습니다.Windows에서 ICMPv6 에코 응답에 IP 헤더가 누락되었습니다.

//IPv4 
replyBuffer.consume(replyBuffer.size()); 
mySocketIPv4->async_receive(replyBuffer.prepare(65575),..); 
--packet received-- 
replyBuffer.commit(length); 
std::istream istr(&replyBuffer); 
icmp_header icmp_hdr; 
ipv4_header ipv4_hdr 
istr >> ipv4_hdr >> icmp_hdr; 

참고 : 아래의 일부 자세한 내용은 수신 한 데이터뿐만 아니라

//IPv6 
replyBuffer.consume(replyBuffer.size()); 
mySocketIPv6->async_receive(replyBuffer.prepare(65575),..); 
--packet received-- 
replyBuffer.commit(length); 
std::istream istr(&replyBuffer); 
icmp_header icmp_hdr; 
ipv6_header ipv6_hdr 
//istr >> ipv6_hdr >> icmp_hdr; - works on Linux only 
istr >> icmp_hdr; 

참고 IP 헤더가 : 데이터의 ICMPv6에만 헤더와 페이로드를 가지고있다. 그러나 Linux에서는 데이터가 ICMPv6 헤더 및 페이로드 뒤에 오는 IP 헤더로 시작됩니다.

에코 응답을 받으면 IP 헤더에서 TTL, 소스 IP 등의 정보를 얻을 필요가 있습니다. 이 경우 IP 헤더 데이터에 어떻게 액세스합니까?

귀하의 도움에 감사드립니다.

답변

0

Winsock에서 Raw 소켓을 사용하여 IPv6 헤더를받지 못했습니다. this MSDN page에서 IPv6 (AF_INET6의 주소 세대)

을 말하기를, 응용 프로그램은 각 관계없이 IPV6_HDRINCL 소켓 옵션의 데이터 그램 을받은 마지막 IPv6 헤더 후 모든받습니다. 응용 프로그램은 원시 소켓을 사용하여 어떤 IPv6 헤더도 수신하지 않습니다.

관련 문제