【问题标题】:How to simulate WSAEWOULDBLOCK on blocking send()?如何在阻塞 send() 时模拟 WSAEWOULDBLOCK?
【发布时间】:2012-06-12 23:49:35
【问题描述】:

我正在尝试通过将内部 Winsock 发送缓冲区减少到一个非常小的值和 2 个线程同时发送来模拟 WSAEWOULDBLOCK 阻塞 send() 与 setsockopt...

通过拔掉网线断开连接或在防火墙中阻止它不足以填满内部发送缓冲区并返回 WSAEWOULDBLOCK ?

我该怎么做?

谢谢。

【问题讨论】:

    标签: c++ sockets winsock send


    【解决方案1】:

    接受远程端的连接,但在该位置tarpit。继续尝试在本地发送,您应该能够填满用于传出流量的数据缓冲区。

    【讨论】:

    • 如何在源代码中进行tarpit?在 recv() 循环中睡觉?我在 MikroTik RouterOS 中尝试过缓送(一种方式),但没有成功,客户端使用 WSAECONNRESET 挂起 send()。我不记得我在哪里看到 Windows 7 自动和内部调整套接字缓冲区的大小。这可能是我永远无法填满发送缓冲区的原因?
    • 是的,accept() 连接并在远程端休眠。
    • 现在我明白了。 Windows 7 有 16KB 的发送缓冲区大小。当我发送更多时,send()“阻塞”直到所有数据都进入内核,但是如果我尝试进行 2 个 send() 调用,其中最后一个发送大小大于 16KB,那么第二个 send( ) 返回 WSAEWOULDBLOCK。即使我把 sleep() 放在了远端的 accept() 之后,本地也一直在发送数据(奇怪)...
    猜你喜欢
    • 2015-04-26
    • 1970-01-01
    • 2019-08-02
    • 2012-02-11
    • 1970-01-01
    • 1970-01-01
    • 2015-04-24
    • 2015-04-30
    • 1970-01-01
    相关资源
    最近更新 更多