Проблема с созданием сокетов из именованного кортежа

#python #sockets

#python #сокеты

Вопрос:

Я создаю серверный сокет python из возвращаемого значения os socket.getaddrinfo , который возвращает последовательность из 5 кортежей (family, socktype, proto, canonname, sockaddr)
Это мой код.

  import socket
 import collections

sock_info_tuple = namedtuple('sock_info_tuple', 'family type proto  cannon sockaddr_tuple')
socket_info =   sock_info_tuple._make(socket.getaddrinfo('127.0.0.1',80,socket.AF_INET,socket.SOCK_STREAM,socket.IPPROTO_TCP))

TypeError                                 Traceback (most recent call last)
<ipython-input-90-b04233a8e38d> in <module>()
  5 #get the socket info
  6 sock_info_tuple = namedtuple('sock_info_tuple', 'family type proto cannon sockaddr_tuple')
----> 7 socket_info =  sock_info_tuple._make(socket.getaddrinfo('127.0.0.1',80,socket.AF_INET,socket     .SOCK_STREAM,socket.IPPROTO_TCP))
  8 
  9 #create the server scket and pass the arguments

<string> in _make(cls, iterable, new, len)

TypeError: Expected 5 arguments, got 1   
  

итак, в чем, вероятно, проблема, и все же socket.getaddrinfo возвращает кортеж

Ответ №1:

Если socket.getaddrinfo возвращается (family, socktype, proto, canonname, sockaddr) как кортеж, вы должны использовать * для распаковки этого кортежа.

 socket_info = sock_info_tuple._make(*socket.getaddrinfo('127.0.0.1',80,socket.AF_INET,socket.SOCK_STREAM,socket.IPPROTO_TCP))