2013-10-04 22 views
2

所以我有一个像下面这样的插座:集“下一个标题”字节V6蟒蛇插座

sock = socket.socket(socket.AF_INET6, socket.SOCK_RAW, socket.getprotobyname("icmp")) 

,当我发出每RFC4443正确构造ICMP6 ECHO REQUEST与因为数据包格式错误,显然是因为IPv6头中的'next header'字节被设置为每个RFC(#for ICMP)为1,所以类型128和代码0(也是有效的校验和)数据包被目标堆栈丢弃。

两件事情:1。 我知道socket.getprotobyname( “ICMP”),使插座ICMP兼容IPv4(?右)... 2. Wireshark的读取数据包作为IPv6的,但协议为ICMP不ICMPv6报...

设置套接字使用protocolbyname(“icmpv6”)(这是无效的,显然,除非有人知道正确的字符串...我试过“icmp6”“icmpv6”,但可能有一些尝试用我可以做的下划线)。

或改变“下一个首部”字节之前,我将数据包发送到58

不得已构建手包。

任何人有想法?很明显,我不是Python中最有经验的人。

回答

1

对于遇到这个人, socket.getprotobyname('<proto>') 返回对应于在/ etc /协议(UNIX)在平面文件中列出的协议的整数和/ C/windows/system32/drivers/etc/protocols(Windows)。 检查出来!这是IP头中唯一的特定于其有效载荷内的数据的字节。 Unix机器上的列表包含所有协议,至少在Mac上是这样,而Windows只包含最常见的协议。你也可以编辑这个文件。

4

这应该做到这一点:

socket.getprotobyname('ipv6-icmp') 
+0

嘿,谢谢,你是对的,我当然是短视的。非常感激。 – jeffery

+0

+1,q和a。这也帮助了我,因为我一直在寻找确切的icmpv6字符串名称。如果OP解决了他的问题,OP应该接受答案。 – fayyazkl