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)
我有一个简单的客户端服务器程序,服务器端可以工作,但由于某种原因我无法让客户端与服务器进行交互。我能够启动服务器并使用 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)