[英]Python icmpv6 client
我正在开发一个简单的 icmpv6 客户端,我的校验和有一些问题,这里是代码,wireshark 显示校验和设置不正确,回溯显示错误,如pcs.FieldBoundsError: 'Value must be between 0 and 65535'
import pcs, sys
from socket import *
from pcs.packets.ethernet import *
from pcs.packets.ipv6 import *
from pcs.packets.icmpv6 import *
class packet:
def __init__(self, src, dst, mac):
self.src = src
self.dst = dst
self.mac = mac
def construct(self):
e = ethernet()
e.src = ether_atob("de:de:de:de:de:de")
e.dst = ether_atob(self.mac)
e.type = ETHERTYPE_IPV6
ip6 = ipv6()
ip6.version = 6
ip6.traffic_class = 0
ip6.flow = 0
ip6.length = 8 # icmpv6 packet length
ip6.next_header = IPPROTO_ICMPV6
ip6.hop = 255
ip6.src = inet_pton(AF_INET6, self.src)
ip6.dst = inet_pton(AF_INET6, self.dst)
icmp6 = icmpv6(ICMP6_ECHO_REQUEST)
icmp6.code = 0
icmp6.id = 0xf0
icmp6.seq = 1
icmp6.mtu = 1280
icmp6.checksum = 0
ip6.length = len(icmp6.getbytes())
ip6.flow = len(ip6.getbytes()) + ip6.length
icmp6.checksum = icmp6.cksum(ip6)
pkt = pcs.Chain([e, ip6, icmp6])
s = pcs.PcapConnector('eth0')
s.write(pkt.bytes, len(pkt.bytes))
if __name__=='__main__':
p = packet(sys.argv[1], sys.argv[2], sys.argv[3])
p.construct()
这似乎与 python-pcs 中导致不正确校验和计算的错误有关。 剪切错误位应该可以工作:
cs = icmp6.cksum(ip6) & 0xffff
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.