ipv6 python sockets not working ! OSError: [Errno 22] Invalid argument

ipv6 python sockets not working ! OSError: [Errno 22] Invalid argument

我有一个简单的客户端服务器程序,服务器端可以工作,但由于某种原因我无法让客户端与服务器进行交互。我能够启动服务器并使用 nc -6 fe80::cbdd:d3da:5194:99be%eth1 2020 并连接到它。

服务器代码:

    #!/usr/bin/env python3
from socket import *
from time import ctime

HOST='::'
PORT = 2020
BUFSIZ = 1024
ADDR = (HOST, PORT)

tcpSerSock = socket(AF_INET6, SOCK_STREAM)
##tcpSerSock.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)

tcpSerSock.bind(ADDR)
tcpSerSock.listen(5)

while True:
        print('Waiting for connection...')

        tcpCliSock, addr = tcpSerSock.accept()
        print('...connected from:', addr)

        while True:
                data = tcpCliSock.recv(BUFSIZ)
                if not data:
                        break
                tcpCliSock.send(('[%s] %s'%(bytes(ctime(), 'utf-8'), data)).encode('utf-8'))
        tcpCliSock.close()
tcpSerSock.close()

客户代码:

    #!/usr/bin/python3
from socket import *





def tcp_ipv6():
    HOST = 'fe80::cbdd:d3da:5194:99be%eth1'
    PORT = 2020
    ADDR = (HOST, PORT)
    BUFSIZ = 1024
    
    sock = socket(AF_INET6, SOCK_STREAM)
    sock.connect(ADDR)
    
    while True:
        data = input('> ')
        if not data:
            break
        sock.send(data)
        response = sock.recv(BUFSIZ)
        if not response:
            break
        print(response.decode('utf-8'))
    sock.close()        
   
tcp_ipv6() 

当我 运行 我得到客户端代码时:

Traceback (most recent call last):
  File "client.py", line 44, in <module>
    tcp_ipv6() 
  File "client.py", line 31, in tcp_ipv6
    sock.connect(ADDR)
OSError: [Errno 22] Invalid argument

编辑1: 感谢 在 python 中使用套接字建立 IPv6 连接 AF_INET6

的 4 元组
ADDR = (HOST, PORT, 0, 0)
sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM, 0)
sock.connect(ADDR)

仍然有同样的错误

有什么想法吗? 提前致谢

你的问题的某些部分之前已经被问过。

Establishing an IPv6 connection using sockets in python

但是,这并不是它无法正常工作的全部原因。如果您查看您的 IPv6 地址。 fe80::cbdd:d3da:5194:99be%eth1 可以看到最后的%eth1。那不是互联网地址的一部分。将 HOST 更改为 HOST = 'fe80::cbdd:d3da:5194:99be'。它应该有效。

我还想指出您的代码中的另一个错误。您正试图通过套接字发送一个字符串(从输入中接收)。但是,此方法只接受类似字节的对象。您可以添加 data = data.encode('utf-8') 来解决这个问题。

更高级别的功能 - create_connection ,在这种情况下连接到端口。示例 scriptlet 如下所示。尽管需要确定 sock.connect 失败的原因。

HOST = "xxxx::xxx:xxxx:xxxx:xxxx%en0"
PORT = 2020
ADDR = (HOST, PORT)
BUFSIZ = 1024

sock=create_connection(ADDR)