无盖插座的紧密RECV环路

tight recv loop for non blocked socket

本文关键字:RECV 环路 插座      更新时间:2023-10-16

我当前使用winsock2对服务器进行编程。工作负载约为1000个并发连接。为了接受插座,我使用的是在阻止模式下运行Accept((的分离线程。但是对于接收数据,我考虑过(也有一个分离的线程(,但是这次使用非阻止模式和像这样的代码:

for (;;)
{
    foreach socket
    {
        int num = socket.recv(..);
        if (num == SOCKET_ERROR && WSAGetLastError() == EAGAIN/EWOULDBLOCK)
            continue;
        else
            // push buffer to worker thread / handle error
    }
    thread.sleep(1);
}

这项工作会在不给CPU遇到困难的情况下工作吗?我在Internet中发现为什么这是不良代码的两个主要原因是1。CPU负载2.许多内核调用。睡眠解决了第一个问题(我希望(,但我对在非阻止套接字模式接收的呼叫表现一无所知,也不为什么这些电话使此不良解决方案。

否,如果不给CPU遇到困难,它将无法使用。从字面上看,睡眠是浪费时间,您可能会完全阻止正确的时间。

不要这样做。我无法想象您为什么首先会想到。