我想模拟测试跨平台连接失败/超时,从阻止connect()
开始:
#!/usr/bin/python3
import socket
s = socket.socket()
endpoint = ('localhost', 28813)
s.bind((endpoint))
# listen for connections, accept 0 connections kept waiting (backlog)
# all other connect()s should block indefinitely
s.listen(0)
for i in range(1,1000):
c = socket.socket()
c.connect(endpoint)
# print number of successfully connected sockets
print(i)
在Linux上,它打印“ 1”并无限期挂起(即我想要的行为)。
在Windows(Server 2012)上,它显示“ 1”,并以ConnectionRefusedError
中止。
在macOS上,它将打印从1到128的所有数字,然后无限期挂起。
因此,我可以接受macOS忽略backlog参数,而只是连接足够的套接字以使客户端阻止新的连接。
如何让Windows也阻止connect()
次尝试?
答案 0 :(得分:0)
在Windows上,SO_CONDITIONAL_ACCEPT socket option允许应用程序具有传入连接,直到accept()
被建立为止。常量(SO_CONDITIONAL_ACCEPT=0x3002
)未在Python模块中公开,但可以手动提供:
s.bind(endpoint)
s.setsockopt(socket.SOL_SOCKET, 0x3002, 1)
s.listen(0)
非常有效,即使第一个连接也保持等待状态。
在macOS上,backlog=0
重置为backlog=SOMAXCONN
,backlog=1
保留除第一次等待以外的所有连接。