之前一直好奇 socket listen(backlog)的参数含义,因为设置多少好像没什么影响。网上查了很久,最终加上自己的试验得出了结论。先上代码。
服务端代码
import socket
import time
if __name__ == '__main__':
sock = socket.socket()
addr = ('127.0.0.1', 80)
sock.bind(addr)
sock.listen(1)
lst = []
while True:
sock_clt, addr_clt = sock.accept()
time.sleep(0.2)
lst.append(sock_clt)
print(len(lst))
客户端代码
import socket
import threading
import time
lst = []
def t():
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务器
try:
sock.connect(('127.0.0.1', 80))
lst.append(sock)
time.sleep(100)
except Exception as e:
print("连接服务器失败:",e)
for i in range(20):
threading.Thread(target=t).start()
当设置了sock.listen(1)的时候,客户端运行会报错如下:
如果sock.listen(20)就不会报错
结论如下:
socket的accept函数每次只能接收一个socket,如果同一时间有大量连接进入,socket要如何处理这些连接呢。实际上应该是使用了缓存socket队列的方式,将还未及时处理的连接保存在队列中,而队列的大小就是listen参数的值了。
欢迎大家讨论和指正。