我使用套接字编写了一个非常简单的python服务器程序。但是我得到了上面提到的错误。我不知道我做错了什么。代码是
import socket
ms=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
ainfo=socket.getaddrinfo('127.0.0.1',1234)
ms.bind(ainfo)
ms.listen(5)
while True:
conn, addr=ms.accept()
data=ms.recv()
if not data:
break;
ms.sendall(data)
conn.close()
ms.close()
错误是
Traceback (most recent call last):
File "server.py", line 4, in <module>
ms.bind(ainfo)
TypeError: getsockaddrarg: AF_INET address must be tuple, not list
答案 0 :(得分:3)
您无需拨打socket.getaddrinfo()
。试试这个:
ms.bind(('127.0.0.1',1234))
套接字地址表示如下:...一对
(host, port)
用于AF_INET地址系列,其中host
是一个字符串,表示Internet域符号中的主机名,如{{1} }或类似'daring.cwi.nl'
的IPv4地址,'100.50.200.5'
是整数。
答案 1 :(得分:0)
您需要传递ainfo[0][4]
而不是ainfo。因为ainfo是元组列表。 socket.getaddrinfo(&#39; 127.0.0.1&#39;,1234)返回
[(<AddressFamily.AF_INET: 2>, <SocketKind.SOCK_STREAM: 1>, 6, '', ('127.0.0.1', 1234)), (<AddressFamily.AF_INET: 2>, <SocketKind.SOCK_DGRAM: 2>, 17, '', ('127.0.0.1', 1234)), (<AddressFamily.AF_INET: 2>, <SocketKind.SOCK_RAW: 3>, 0, '', ('127.0.0.1', 1234))]
所以你需要使用索引ainfo [0] [4]来访问ip和端口。
或者,您可以直接使用ms.bind(('127.0.0.1',1234))
。
答案 2 :(得分:0)
我明白了,我使用ms.bind(ainfo [0] [4])来得到正确答案。