Python 2.7 IPv6目标选项标头

Python 2.7 IPv6目标选项标头,python-2.7,python-3.x,ipv6,Python 2.7,Python 3.x,Ipv6,我正在从事一个软件定义的网络研究项目,我需要的是制作一个简单的UDP服务器,将数据标记放入UDP数据包的目标选项字段(IPv6)。我希望使用sendmsg()recvmsg()命令,或者使用setsockopt()和getsockopt()。因此,Python2.7没有sendmsg()或recvmsg(),虽然我可以让setsockopt()正确地将标记加载到数据包中(我在Wireshark中看到),但getsockopt()命令只返回一个零,即使有头 #Python 2.7 client #

我正在从事一个软件定义的网络研究项目,我需要的是制作一个简单的UDP服务器,将数据标记放入UDP数据包的目标选项字段(IPv6)。我希望使用sendmsg()recvmsg()命令,或者使用setsockopt()和getsockopt()。因此,Python2.7没有sendmsg()或recvmsg(),虽然我可以让setsockopt()正确地将标记加载到数据包中(我在Wireshark中看到),但getsockopt()命令只返回一个零,即使有头

#Python 2.7 client
#This code does put the dest opts header onto the packet correctly
#dst_header is a packed binary string (construction details irrelevant--
#  it appears correctly formatted and parsed in Wireshark)

addr = ("::", 5000, 0, 0)
s = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
s.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_DSTOPTS, dst_header)
s.sendto('This is my message ', addr)

#Python 2.7 server
addr = ("::", 5000, 0, 0)
s = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
s.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_RECVDSTOPTS, 1)
s.bind(addr)
data, remote_address = s.recvfrom(MAX)
header_data = s.getsockopt(socket.IPPROTO_IPV6, socket.IPPROTO_DSTOPTS, 1024)
我也在Python 3.4中尝试了这一点,它确实有sendmsg()和recvmsg(),但我只得到了一条错误消息“OSError:[Errno 22]:Invalid argument”,尽管我(显然)传递了正确的类型:

s.sendmsg(["This is my message"], (socket.IPPROTO_IPV6, socket.IPV6_DSTOPTS, dst_header), 0, addr)  #dst_header is same string as for 2.7 version

看起来sendmsg()和recvmsg()的99%的用法都是用来传递UNIX文件描述符的,这不是我想要做的。有人有什么想法吗?我原以为这只是一个四行或五行的没有什么特别的程序,但我被难住了。

好吧,我将在这里部分回答我自己的问题,有可能搜索引擎会把和我有同样问题的人带到这里

我让Python 3.4代码正常工作。问题不在于标题,而在于消息正文。具体来说,消息正文和标题选项值字段都必须是字节(或bytearray)对象,存储在一个iterable容器(这里是一个列表)中。通过传递它[“这是我的消息”],我发送的是字符串,而不是字节对象;Python放手了,但操作系统无法应对

你可能会说我被Python3.X中字符串处理的变化所“byted”