Принимать несколько подключений netcat в скрипте python

У меня есть скрипт Python для получения строк, отправленных netcat. Это работает, когда у меня есть 1 клиент, отправляющий строки, но второй не может подключиться.

import socket

HOST = 'localhost'   # use '' to expose to all networks
PORT = 12345

def incoming(host, port):
  """Open specified port and return file-like object"""
  sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  # set SOL_SOCKET.SO_REUSEADDR=1 to reuse the socket if
  # needed later without waiting for timeout (after it is
  # closed, for example)
  sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  sock.bind((host, port))
  sock.listen(0)   # do not queue connections
  request, addr = sock.accept()
  return request.makefile('r', 0)
# /-- network ---


for line in incoming(HOST, PORT):
  print line,

Я отправляю строки от 2 клиентов в этот скрипт, но когда второй клиент начинает отправлять, соединение прерывается. Можно ли разрешить более 1 одновременного подключения?

Изменение sock.listen() на большее число не помогает


person user3644817    schedule 30.05.2014    source источник


Ответы (1)


Вы принимаете только одно соединение. Кроме того, я нахожу странным, что вы хотите дублировать дескриптор файла и читать его, как вы это делаете сейчас. Итак, почему бы вам не попробовать что-то вроде этого: выдать входящий запрос и выбросить StopIteration по истечении времени ожидания, и в качестве бонуса вместо этого использовать recv

import socket

HOST = 'localhost'   # use '' to expose to all networks
PORT = 12345

def incoming(host, port):
    """Open specified port and yield requests"""
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    sock.settimeout(10)
    sock.bind((host, port))
    sock.listen(0)
    try:
        while True:
            request, addr = sock.accept()
            yield request
            request.close()
    except socket.timeout:
        raise StopIteration
    finally:
        sock.close()

for request in incoming(HOST, PORT):
    print request.recv(1024)
person agrinh    schedule 30.05.2014
comment
Я хочу получать строки непрерывно. С помощью этого скрипта мне приходится перезапускать соединение каждый раз, когда я хочу что-то отправить. - person user3644817; 31.05.2014
comment
Поэтому просто не закрывайте сокеты во входящей функции, а сохраняйте и используйте сокеты до тех пор, пока вы хотите их использовать. Это решает проблему приема нескольких подключений. Как вы затем будете использовать сокеты после этого, зависит от вас. Я бы предложил собрать их и запустить select/poll/epoll для обнаружения событий чтения, если вы хотите просто распечатать все полученное. - person agrinh; 01.06.2014