Принимать несколько соединений 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() на большее число не помогает
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)