gpt4 book ai didi

Python 原始 IPv6 套接字错误

转载 作者:行者123 更新时间:2023-12-01 06:14:36 26 4
gpt4 key购买 nike

我在 python 中使用原始 IPv6 套接字时遇到一些问题。我通过以下方式连接:

    if self._socket != None:
# Close out old socket first
self._socket.close()
self._socket = socket.socket(socket.AF_INET6, socket.SOCK_RAW)
self._socket.bind((self._interface,0))
self._socket.sendall(data)

其中 self._interface 是我的本地地址;特别是“fe80::fa1e:dfff:fed6:221d”。尝试此操作时,我收到以下错误:

  File "raw.py", line 164, in connect
self._socket.bind((self._interface,0))
File "<string>", line 1, in bind
socket.error: [Errno 49] Can't assign requested address

如果我使用我的 ipv6 本地主机地址作为 self._interface ("::1"),我实际上可以绑定(bind)该地址,但无法发送任何内容:

    self._socket.sendall(data)
File "<string>", line 1, in sendall
socket.error: [Errno 39] Destination address required

为什么原始套接字需要目标地址?有没有人在 python 中使用过原始 IPv6 套接字,并且可以帮助我理解为什么会发生这种情况?

最佳答案

虽然这是一个老问题,但我想添加一个有效的答案,并帮助任何后来偶然发现它的人。

关键问题是:

原始套接字未绑定(bind)并连接到其他套接字。另外,sendto 是要使用的正确 API。

此外,ipv6 数据包需要 4 个元组结构作为目标地址,而不是 ipv4 需要两个元组结构。

最后,堆栈(至少在 Linux mint 15 上)对 ipv6 数据包更加严格。如果您尝试发送一个空的 icmpv4 echo 请求,Python 会允许它并在线上发送一个无意义的数据包。与 ipv6 的情况一样,当您尝试发送空数据包时,它只会给出“无效参数”错误。因此,如果是 ipv6,则还需要有效的请求。以下示例针对 ipv6 执行所有操作,并向环回地址发送有效的 ping echo 请求。

import socket

def main(dest_name):
addrs = socket.getaddrinfo(dest_name, 0, socket.AF_INET6, 0, socket.SOL_IP)


print addrs
dest = addrs[0]

# A minimal ICMP6-echo message (thanks to abarnert)
data = '\x80\0\0\0\0\0\0\0'

icmp = socket.getprotobyname('ipv6-icmp')
#print icmp

send_socket = socket.socket(socket.AF_INET6, socket.SOCK_RAW, icmp)
print "sent to " + str(dest[4])
send_socket.sendto(data, dest[4])
send_socket.close()

if __name__ == '__main__':
main('::1')

关于Python 原始 IPv6 套接字错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3973142/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com