模拟 TCP tarpit
Simulate a TCP tarpit
我想模拟测试跨平台连接失败/超时,从阻塞开始 connect()
s:
#!/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 忽略积压参数,只连接足够的套接字供客户端阻止新连接。
如何让 Windows 也阻止 connect()
次尝试?
在 Windows 上,SO_CONDITIONAL_ACCEPT socket option 允许应用程序等待传入连接,直到 accept()
ed。常量 (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
保留除第一个等待之外的所有连接。
我想模拟测试跨平台连接失败/超时,从阻塞开始 connect()
s:
#!/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 忽略积压参数,只连接足够的套接字供客户端阻止新连接。
如何让 Windows 也阻止 connect()
次尝试?
在 Windows 上,SO_CONDITIONAL_ACCEPT socket option 允许应用程序等待传入连接,直到 accept()
ed。常量 (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
保留除第一个等待之外的所有连接。