Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python上创建IPv6套接字?为什么得到socket.error:(22,';无效参数';)?_Python_Sockets_Ipv6 - Fatal编程技术网

如何在python上创建IPv6套接字?为什么得到socket.error:(22,';无效参数';)?

如何在python上创建IPv6套接字?为什么得到socket.error:(22,';无效参数';)?,python,sockets,ipv6,Python,Sockets,Ipv6,我想在python上使用Ipv6套接字,我是这样做的: #!/usr/bin/env python import sys import struct import socket host = 'fe80::225:b3ff:fe26:576' sa = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM) sa.bind((host , 50000)) 但它失败了: socket.error: (22, 'Invalid argument') ?

我想在python上使用Ipv6套接字,我是这样做的:

#!/usr/bin/env python
import sys
import struct
import socket

host = 'fe80::225:b3ff:fe26:576'
sa = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
sa.bind((host , 50000))
但它失败了:

socket.error: (22, 'Invalid argument') ?
有人能帮我吗?谢谢

我像这样重做,但仍然不能工作

    >>>host = 'fe80::225:b3ff:fe26:576'
    >>>sa = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
    >>>res = socket.getaddrinfo(host, port, socket.AF_UNSPEC, socket.SOCK_DGRAM, 0, socket.AI_PASSIVE)
    >>>family, socktype, proto, canonname, sockaddr = res[0]
    >>>print sockaddr
('fe80::225:b3ff:fe26:576', 50001, 0, 0)
    >>>sa.bind(sockaddr)
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "<string>", line 1, in bind
socket.error: (22, 'Invalid argument')
主机='fe80::225:b3ff:fe26:576' >>>sa=socket.socket(socket.AF_INET6,socket.SOCK_DGRAM) >>>res=socket.getaddrinfo(主机、端口、socket.AF_unsec、socket.SOCK_DGRAM、0、socket.AI_被动) >>>family,socktype,proto,canonname,sockaddr=res[0] >>>打印sockaddr ('fe80::225:b3ff:fe26:576',50001,0,0) >>>sa.bind(sockaddr) 回溯(最近一次呼叫最后一次): 文件“”,第1行,是否在中? 文件“”,第1行,处于绑定状态 socket.error:(22,“无效参数”)
问题有两个部分

第一期

您应该使用sa.bind(sockaddr),其中sockaddr是从getaddrinfo获得的

>>> HOST = 'localhost'
>>> PORT = 50007 
>>> res = socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC, socket.SOCK_DGRAM, 0, socket.AI_PASSIVE)
>>> family, socktype, proto, canonname, sockaddr = res[1]
>>> proto
17
>>> sockaddr
('fe80::1%lo0', 50007, 0, 1)
第二期

如果您查看位于的套接字文档中提供的示例

套接字接受三个参数

socket( [family[, type[, proto]]])
根据文件

Create a new socket using the given address family, 
socket type and protocol number. The address family 
should be AF_INET (the default), AF_INET6 or AF_UNIX. 
The socket type should be SOCK_STREAM (the default), 
SOCK_DGRAM or perhaps one of the other "SOCK_" constants. 
The protocol number is usually zero and may be omitted in that case.
如果使用getaddressinfo获取proto的值,则该值与默认值0不同

但是当我执行以下命令时,我得到了一个不同的协议值-17。 你可能也想对此进行调查


当然,socket.has_ipv6对我来说是正确的。

上面缺少的另一件事是fe80::*是链接本地地址。因此,如果没有作用域ID,从技术上讲,您无法使用它们。
只是为了防止这种情况发生,“
链接本地
”意味着该地址只能在特定的链接上使用,但推论是,由于地址在理论上是特定于链接的,所以可以在多个链接上使用相同的地址
现在允许在大多数情况下,通过将其转换为EUI-64,然后翻转U/L位(),从已经唯一的硬件(EUI-48)地址生成链路本地地址,但这不是生成链路本地地址的唯一方法,其他机制可能导致重新使用该地址(我不认为有任何东西禁止这样做)。因此,现在你知道它为什么不起作用了。
下一个问题是如何解决它,或者从哪里获得作用域ID。很遗憾,这是不明显的。如果你阅读讨论“
作用域
”的IPV6 RFC您发现它是以一种通用的方式定义的。实际上,如果您在Linux(可能也是Windows/Mac?)中运行此代码,您可以使用接口索引


请注意,nss MDN中当前存在一个错误。本地名称返回时作用域id始终为零,因此在Linux中使用。除非代码已经计算出作用域id并自行设置,否则本地名称基本上不起作用。

是否验证socket.U ipv6是否返回真值?为什么要绑定到任意链接本地地址?在9中9%的情况下,您希望绑定到::(即所有接口)。我已使用您的方法编辑了我的问题,其中包括错误。谢谢>>>socket.has\u ipv6 True