IPv6目标选项标头

时间:2014-10-11 18:31:04

标签: python-2.7 python-3.x ipv6

我正在开发一个软件定义的网络研究项目,我需要的是创建一个简单的UDP服务器,将数据标记放入UDP数据包的目标选项字段(IPv6)中。我期待sendmsg()recvmsg()命令,或者使用setsockopt()和getsockopt()。因此,Python 2.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]:无效的参数”,即使我传递了它(显然)正确的类型:

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文件描述符,这不是我想要做的。有人有任何想法吗?我认为这只是一个四五行没什么特别的程序,但我很难过。

1 个答案:

答案 0 :(得分:0)

好的,我将在这里部分回答我自己的问题,因为搜索引擎会让某人遇到与我相同的问题。

我使用了Python 3.4代码。问题不是标题,而是邮件正文。具体来说,消息正文和标题选项值字段都必须是字节(或字节数组)对象,存储在可迭代容器(此处为列表)中。传递它["这是我的消息"]我发送的是字符串,而不是字节对象; Python让它走了,但操作系统无法应对。

你可能会说我是" byted"通过Python 3.X中字符串处理的变化......