【发布时间】:2014-10-11 18:31:03
【问题描述】:
我正在从事一个软件定义的网络研究项目,我需要做一个简单的 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]: 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-2.7 python-3.x ipv6