【问题标题】:ipv6 python sockets not working ! OSError: [Errno 22] Invalid argumentipv6 python 套接字不工作! OSError:[Errno 22] 无效参数
【发布时间】:2021-08-25 06:46:31
【问题描述】:

我有一个简单的客户端服务器程序,服务器端可以工作,但由于某种原因,我无法让客户端与服务器交互。我能够启动服务器并使用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: 感谢Establishing an IPv6 connection using sockets in python AF_INET6 的 4 元组

ADDR = (HOST, PORT, 0, 0)
sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM, 0)
sock.connect(ADDR)

还是一样的错误

有什么想法吗? 提前致谢

【问题讨论】:

    标签: python sockets ipv6


    【解决方案1】:

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

    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') 来解决此问题。

    【讨论】:

    • 如果已经存在类似问题,请将其标记或投票为重复问题。
    • 感谢@bobveringa 的回复,没用,还是一样的错误,我把ADDR 改成了ADDR = (HOST, PORT, 0, 0)sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM, 0)
    • @naoussa 您的代码中还有另一个错误,我已经更新了答案。我在我的机器上运行了它,现在它似乎可以工作了。
    • @bobveringa 谢谢您,您的最后一次编辑 data = data.encode('utf-8') 很有帮助。
    【解决方案2】:

    更高级别的函数 - create_connection ,在这种情况下可以连接到端口。示例脚本如下所示。虽然需要确定 sock.connect 失败的原因。

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

    【讨论】:

    • 当我在树莓派上启动客户端试图连接在 ubunto 上启动的服务器上时出现新错误 Traceback (most recent call last): File "client.py", line 48, in &lt;module&gt; tcp_ipv6() File "client.py", line 32, in tcp_ipv6 sock=create_connection(ADDR) File "/usr/lib/python3.7/socket.py", line 707, in create_connection for res in getaddrinfo(host, port, 0, SOCK_STREAM): File "/usr/lib/python3.7/socket.py", line 748, in getaddrinfo for res in _socket.getaddrinfo(host, port, family, type, proto, flags): socket.gaierror: [Errno -2] Name or service not known
    猜你喜欢
    • 2021-02-10
    • 2019-04-27
    • 1970-01-01
    • 2013-08-05
    • 1970-01-01
    • 1970-01-01
    • 2018-10-05
    • 1970-01-01
    相关资源
    最近更新 更多