2017-06-16 6 views
0

Ich schrieb ein wirklich einfaches Python-Server-Programm mit den Sockets. Aber ich bekomme den oben erwähnten Fehler. Ich weiß nicht, was ich falsch gemacht habe. Der Code istTypeError: getsockaddrarg: AF_INET-Adresse muss Tupel sein, nicht Liste

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() 

Der Fehler

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 

Antwort

0

Sie müssen in ainfo[0][4] statt AINFO passieren. Weil ainfo eine Liste von Tupeln ist. socket.getaddrinfo ('127.0.0.1', 1234) kehrt

[(<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))] 

So können Sie den Index AINFO [0] [4] verwenden müssen, die IP und Port zuzugreifen.

Alternativ können Sie einfach ms.bind(('127.0.0.1',1234)) direkt verwenden.

1

ist Sie den Anruf nicht zu socket.getaddrinfo() benötigen. Versuchen Sie stattdessen:

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

die socket documentation Zitiert:

Socket addresses are represented as follows: ... A pair (host, port) is used for the AF_INET address family, where host is a string representing either a hostname in Internet domain notation like 'daring.cwi.nl' or an IPv4 address like '100.50.200.5' , and port is an integer.

0

Ich habe es, ich benutzte ms.bind (ainfo [0] [4]), um die richtige Antwort zu erhalten.

Verwandte Themen