相关疑难解决方法(0)

在 Windows 上,WSASend 失败并显示 WSAENOBUFS

在 Windows XP 上,当我在非阻塞套接字上迭代调用WSASend时,它会失败并显示 WSAENOBUFS。

我这里有两个案例:

情况1:

在非阻塞套接字上,我调用WSASend。这是伪代码:

while(1)
{
    result = WSASend(...); // Buffersize 1024 bytes
    if (result == -1)
    {
        if (WSAGetLastError() == WSAENOBUFS)
        {
            // Wait for some time before calling WSASend again
            Sleep(1000);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,WSASend 成功返回约 88000 次。然后,它会因 WSAENOBUFS 失败,并且即使在一段时间后尝试也不会恢复,如代码所示。

案例2:

为了解决这个问题,我引用了这个并按照那里的建议,就在上面的代码之前,我用 SO_SNDBUF 调用了setsockopt并设置了 buffersize 0(零)

在这种情况下,WSASend 成功返回约 2600 次。然后就失败了。但等了2600次又成功了又失败。

现在我在这两种情况下都有这些问题:

情况1:

  1. 这里的88000这个数字是由什么因素决定的呢?
  2. 如果失败是因为 TCP 缓冲区已满,为什么一段时间后没有恢复?

案例2:

  1. 再说一遍,这里的2600这个数字是由什么因素决定的呢?
  2. 正如 Microsoft 知识库文章中所述,如果直接从应用程序缓冲区发送而不是内部 TCP 缓冲区,为什么会因 WSAENOBUFS 失败?

编辑:

对于异步套接字(在 …

sockets windows networking tcp

2
推荐指数
1
解决办法
3283
查看次数

标签 统计

networking ×1

sockets ×1

tcp ×1

windows ×1