在Python脚本中接受多个netcat连接

0 投票
1 回答
1866 浏览
提问于 2025-04-18 08:03

我有一个Python脚本,用来接收通过netcat发送的字符串。当只有一个客户端发送字符串时,它工作得很好,但第二个客户端却无法连接。

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,

我从两个客户端向这个脚本发送字符串,但当第二个客户端开始发送时,连接就会中断。请问有没有办法让它支持多个客户端同时连接呢?

把sock.listen()的数字改大也没有用。

1 个回答

1

你现在只接受一个连接。而且,我觉得你想复制文件描述符并像现在这样读取它有点奇怪。那么,为什么不试试这个方法呢:在请求到达时返回,并在超时时抛出停止迭代的错误,另外,使用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)

撰写回答