【问题标题】:IPv6 destination options headerIPv6 目标选项标头
【发布时间】: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


    【解决方案1】:

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

    我得到了 Python 3.4 代码。问题不在于标题,而在于消息正文。具体来说,消息正文和标头选项值字段都必须是字节(或字节数组)对象,存储在可迭代容器(此处为列表)中。通过传递它 ["This is my message"] 我发送的是一个字符串,而不是字节对象; Python 放手了,但操作系统无法应对。

    你可能会说我被 Python 3.X 中字符串处理的变化“吓到了”...

    【讨论】:

      猜你喜欢
      • 2014-05-22
      • 2016-09-12
      • 1970-01-01
      • 2013-01-23
      • 2013-07-06
      • 2021-05-20
      • 1970-01-01
      • 2012-12-25
      • 2012-10-26
      相关资源
      最近更新 更多