如何限制套接字的连接数并触发客户端超时(Python)

b_pcakes

如何设置服务器套接字一次可以接受的连接数限制?我希望能够设置最大连接数,然后一旦达到该限制,客户端进行的任何进一步尝试连接都将导致超时。到目前为止,我已经为服务器尝试过类似的操作:

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Java客户端套接字返回连接超时异常

来自分类Dev

如何为默认Swagger Android客户端设置连接和套接字超时

来自分类Dev

Python客户端不断失去与tcp套接字的连接

来自分类Dev

Python套接字等待客户端连接

来自分类Dev

套接字客户端连接

来自分类Dev

客户端套接字连接被拒绝

来自分类Dev

如何使用url将python套接字客户端连接到服务器套接字?

来自分类Dev

连接到服务器时客户端套接字超时

来自分类Dev

如何使服务器套接字广播到那里,并让客户端套接字检测并连接

来自分类Dev

套接字客户端如何setSoTimeout

来自分类Dev

Python tcp套接字客户端

来自分类Dev

如何使用客户端套接字作为服务器套接字python

来自分类Dev

每个客户端的最大Websocket连接数

来自分类Dev

每个客户端的最大Http并发连接数

来自分类Dev

在FTP客户端套接字程序中拒绝连接

来自分类Dev

通过套接字连接从kext验证客户端

来自分类Dev

TCP客户端套接字。连接并等待输入流

来自分类Dev

Web套接字连接从Android客户端失败

来自分类Dev

Android聊天客户端:套接字连接

来自分类Dev

服务器/客户端套接字连接

来自分类Dev

在FTP客户端套接字程序中拒绝连接

来自分类Dev

POSIX 套接字客户端连接到自身

来自分类Dev

将客户端重新连接到不同的套接字

来自分类Dev

C ++中的Bittorrent客户端,在非阻塞套接字上连接到对等方总是超时

来自分类Dev

如何使服务器套接字广播在那里,并让客户端套接字检测并连接

来自分类Dev

如何按套接字连接从中传播的客户端应用程序实例进行分组?

来自分类Dev

如何识别连接到AF_UNIX套接字的客户端?

来自分类Dev

如何确定客户端是否已连接到我的套接字?

来自分类Dev

如何检测客户端何时与UDS断开连接(Unix域套接字)

Related 相关文章

  1. 1

    Java客户端套接字返回连接超时异常

  2. 2

    如何为默认Swagger Android客户端设置连接和套接字超时

  3. 3

    Python客户端不断失去与tcp套接字的连接

  4. 4

    Python套接字等待客户端连接

  5. 5

    套接字客户端连接

  6. 6

    客户端套接字连接被拒绝

  7. 7

    如何使用url将python套接字客户端连接到服务器套接字?

  8. 8

    连接到服务器时客户端套接字超时

  9. 9

    如何使服务器套接字广播到那里,并让客户端套接字检测并连接

  10. 10

    套接字客户端如何setSoTimeout

  11. 11

    Python tcp套接字客户端

  12. 12

    如何使用客户端套接字作为服务器套接字python

  13. 13

    每个客户端的最大Websocket连接数

  14. 14

    每个客户端的最大Http并发连接数

  15. 15

    在FTP客户端套接字程序中拒绝连接

  16. 16

    通过套接字连接从kext验证客户端

  17. 17

    TCP客户端套接字。连接并等待输入流

  18. 18

    Web套接字连接从Android客户端失败

  19. 19

    Android聊天客户端:套接字连接

  20. 20

    服务器/客户端套接字连接

  21. 21

    在FTP客户端套接字程序中拒绝连接

  22. 22

    POSIX 套接字客户端连接到自身

  23. 23

    将客户端重新连接到不同的套接字

  24. 24

    C ++中的Bittorrent客户端,在非阻塞套接字上连接到对等方总是超时

  25. 25

    如何使服务器套接字广播在那里,并让客户端套接字检测并连接

  26. 26

    如何按套接字连接从中传播的客户端应用程序实例进行分组?

  27. 27

    如何识别连接到AF_UNIX套接字的客户端?

  28. 28

    如何确定客户端是否已连接到我的套接字?

  29. 29

    如何检测客户端何时与UDS断开连接(Unix域套接字)

热门标签

归档