实例代码
服务器等待客户端连接的代码
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)中由于网速原因造成的延迟?