如何设置服务器套接字一次可以接受的连接数限制?我希望能够设置最大连接数,然后一旦达到该限制,客户端进行的任何进一步尝试连接都将导致超时。到目前为止,我已经为服务器尝试过类似的操作:
sock = socket.socket()
sock.setblocking(0)
sock.bind(address)
sock.listen(0)
connections = []
while True:
readable, writable, exceptional = select.select([sock], [], [])
if readable and len(connections) < MAX_CONNECTIONS:
connection, client_address = s.accept()
connections.append(connection)
# Process connection asynchronously
对于客户:
try:
sock = socket.create_connection(self.address, timeout=TIMEOUT)
sock.settimeout(None)
print "Established connection."
except socket.error as err:
print >> sys.stderr, "Socket connection error: " + str(err)
sys.exit(1)
# If connection successful, do stuff
由于该程序其余部分的结构,我选择在服务器上使用非阻塞套接字,并且我不想更改此设置。现在,即使达到了限制并且服务器停止接受它们,客户端也可以连接到服务器。我该如何解决?谢谢。
我相信这里可能会有一些误会select()
。根据该手册页,select()
返回“为某种类型的IO操作准备就绪”的文件描述符,其中ready表示“可以执行相应的IO操作而不会阻塞”。侦听套接字上的相应IO操作为accept()
,如果操作系统已经为您进行了完整的TCP握手,则只能在不阻塞的情况下执行,否则,例如,您可能会阻塞等待客户端的最终ACK。
这意味着只要监听套接字处于打开状态,即使应用程序未处理连接,操作系统也将接受它们的连接。如果要在设置数量后拒绝连接,则基本上有两个选择:
第二个选项比较复杂,需要使用该SO_REUSEADDR
选项,这在您的情况下可能不正确。尽管它似乎确实可以在Linux上可靠地运行,但它也许也不能在所有操作系统上都可以工作。
这是第二种解决方案的简要概述(因为第一种非常简单)。
def get_listening_socket():
sock = socket.socket()
sock.setblocking(0)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(('0.0.0.0', 5555))
sock.listen(0)
return sock
sock = get_listening_socket()
LIMIT = 1
conns = {sock}
while True:
readable, writable, exceptional = select.select(conns, [], [])
if sock in readable: # new connection on the listening socket
conn, caddr = sock.accept()
conns.add(conn)
if len(conns) > LIMIT: # ">" because "sock" is also in there
conns.remove(sock)
sock.close()
else: # reading from an established connection
for c in readable:
buf = c.recv(4096)
if not buf:
conns.remove(c)
sock = get_listening_socket()
conns.add(sock)
else:
print("received: %s" % buf)
但是,您可能想重新考虑为什么要这样做。如果仅是要在服务器上节省一些内存,那么您可能会过度优化,而应该考虑使用syn-cookie。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句