python - 快速检测或模拟 WSAECONNREFUSED

标签 python windows sockets winsock

Windows 套接字在涉及 WSAECONNREFUSED 时有一些奇怪的行为(这意味着积压已满或端口不可用,请参阅 https://stackoverflow.com/a/10308338/851737)。如果 Windows 检测到其中一种情况,它会重试(最多)两次,间隔为 0.5 秒。这意味着在套接字连接尝试 (http://support.microsoft.com/kb/175523/en-us) 上检测 WSAECONNREFUSED 至少需要 1 秒。

有没有什么方法可以在不扰乱注册表值的情况下加快检测速度?我需要在单元测试中模拟拒绝套接字连接。像使用原始套接字模拟拒绝连接这样的解决方法也是可以接受的。

这是一个简单的 Python 脚本来演示这个问题:

import errno
import socket
import time

PORT = 50123


def main():
    s = socket.socket()
    s.bind(('127.0.0.1', PORT))
    s.listen(0)
    client = socket.socket()
    client.connect(('127.0.0.1', PORT))

    client2 = socket.socket()
    start = time.time()

    try:
        client2.connect(('127.0.0.1', PORT))
    except socket.error as e:
        assert e.errno == errno.WSAECONNREFUSED
        print 'connection attempt took', time.time() - start
    finally:
        client2.close()
        client.close()
        s.close()


if __name__ == '__main__':
    main()

最佳答案

这不是你问的。但是如果你只在unittests 中需要这个,mock图书馆会很有用。

import errno
import socket
import time
import mock

PORT = 50123


def connect_mock(*agrs):
    raise socket.error(errno.WSAECONNREFUSED, "Testing")


def main():
    s = socket.socket()
    s.bind(('127.0.0.1', PORT))
    s.listen(0)
    client = socket.socket()
    client.connect(('127.0.0.1', PORT))

    client2 = socket.socket()
    start = time.time()

    with mock.patch('socket.socket.connect', connect_mock):
        try:
            client2.connect(('127.0.0.1', PORT))
            print "done"
        except socket.error as e:
            assert e.errno == errno.WSAECONNREFUSED
            print 'connection attempt took', time.time() - start
        finally:
            client2.close()
            client.close()
            s.close()


if __name__ == '__main__':
    main()

关于python - 快速检测或模拟 WSAECONNREFUSED,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21167888/

相关文章:

c++ - 有没有办法嵌入Windows保存对话框

c++ - 不再找到 DirectX 命名空间

python - ZeroMQ ROUTER 套接字无法向 REP 套接字发送消息

c++ - 在 C/C++ 中创建和发送数据包

python / Pandas :How does one pivot a table whereby the unique values in a specified multi -index or column form part of the resultant column name?

python - 声子后端能力太窄

python - 如何通过pip安装websocket 8.1

python - 给定 SymPy 中的方程组,如何用其他变量表示一个变量?

linux - 如何从 Active Directory 获取用户密码到期日期?

linux - tcpdump 报告的 tcp 数据包 “size” 与实际发送的 IP 数据包有何关联?