我正在进行一项软件定义网络研究项目,我需要创建一个简单的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文件描述符,这不是我想要做的。有人有什么想法吗?我以为这只是一个四五行普通程序,但我却被难住了。