0

我想使用 select 调用从我的写入套接字 fd 发送()数据。我将使用非阻塞套接字实现。哪个实现更好。

while(u4BytesSent < u2BufLen)
{

    i4RetVal = send(sockFd, au1Buf + u4BytesSent, (u2BufLen - u4BytesSent));
    if(i4RestVal == -1 && errno != EWOULDBLOCK)
    {
        break;
    }
    i4BytesSent = i4BytesSent + i4RetVal;   
}

如果发送缓冲区频繁变满,这段代码会占用 CPU 吗?

或者

使用具有无限超时的 Select 调用。 select() 在 CPU 占用等情况下会有更好的性能吗?

4

1 回答 1

1

如果发送缓冲区频繁变满,这段代码会占用 CPU 吗?

是的。它也会表现不正确(很可能会崩溃),因为它最终会在错误时-1重复i4BytesSent添加错误返回值。

使用select()无限(或至少非常长)超时应该可以正常工作。您的进程将休眠,直到套接字上的数据可用。

鉴于您所描述的,您最好不要使用非阻塞套接字。如果您要做的只是将它们包装起来select()以使写操作无论如何都阻塞,那肯定是没有意义的!

于 2013-05-19T17:30:06.580 回答