IPv6 目标选项头

3

我正在进行一项软件定义网络研究项目,我需要创建一个简单的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

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

1个回答

1

好的,我将在此部分回答自己的问题,以防万一搜索引擎会把有同样问题的人带到这里。

我成功地运行了Python 3.4代码。问题不在头文件上,而是在消息正文上。具体来说,消息正文和头选项值字段都必须是字节(或bytearray)对象,存储在可迭代容器中(这里是列表)。通过传递["This is my message"],我发送了一个字符串,而不是一个字节对象;Python让它通过了,但操作系统无法处理它。

你可以说我被Python 3.X中字符串处理方式的更改“byted”了....


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接