模拟TCP tarpit

时间:2019-05-29 10:48:39

标签: sockets tcp cross-platform

我想模拟测试跨平台连接失败/超时,从阻止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()次尝试?

1 个答案:

答案 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=SOMAXCONNbacklog=1保留除第一次等待以外的所有连接。