TypeError:getsockaddrarg:AF_INET地址必须是元组,而不是列表

时间:2017-06-16 03:42:20

标签: python sockets

我使用套接字编写了一个非常简单的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

3 个答案:

答案 0 :(得分:3)

您无需拨打socket.getaddrinfo()。试试这个:

ms.bind(('127.0.0.1',1234))

引用socket documentation

  

套接字地址表示如下:...一对(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])来得到正确答案。