linux - 对于Python中socket.listen()与多线程结合的困惑?
巴扎黑
巴扎黑 2017-04-18 10:04:18
0
2
326

这是Python Cookbook中的一个例子

实例代码

服务器等待客户端连接的代码

from threading import Thread
from socket import socket, AF_INET, SOCK_STREAM

def echo_server(addr, nworkers):
    # Run the server
    sock = socket(AF_INET, SOCK_STREAM)
    sock.bind(addr)
    # 这里设置了listen(5),listen(5)限制了一个时刻服务器最多接收的客户端。
    sock.listen(5)
    while True:
        client_sock, client_addr = sock.accept()
        # 调用echo_client来处理客户端的连接
        t = Thread(target=echo_client, args=(client_sock, client_addr))
        t.daemon = True
        t.start()

echo_server(('',15000)

服务器处理客户端的代码

def echo_client(sock, client_addr):
    '''
    Handle a client connection
    '''
    print('Got connection from', client_addr)
    while True:
        msg = sock.recv(65536)
        if not msg:
            break
        sock.sendall(msg)
    print('Client closed connection')
    sock.close()

问题描述

问题一

书中是这样描述上面这个例子的: 尽管这个也可以工作, 但是它不能抵御有人试图通过创建大量线程让你服务器资源枯竭而崩溃的攻击行为。

但是我不明白的是服务器已经设置了listen(5),这个listen(5)难道不会限制每次只有5个客户端能够连接吗?攻击者怎么可以创造多个线程?


问题二

对于服务器网络IO延迟有一点不懂的地方,以上面的代码段2为例子,网络IO延迟是不是就是msg = sock.recv(65536)和sock.sendall(msg)中由于网速原因造成的延迟?

巴扎黑
巴扎黑

全部回复(2)
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!