select()调用无限超时

时间:2013-05-19 17:16:40

标签: sockets select cpu

我想从我的写套接字fd中使用select调用send()数据。我将使用非阻塞套接字实现。 哪种实施更好。

while(u4BytesSent < u2BufLen)
{

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

如果发送缓冲区频繁变满,此代码是否会占用CPU?

OR

使用具有无限超时的选择调用。选择()是否具有更好的CPU占用性能?

1 个答案:

答案 0 :(得分:1)

  

如果发送缓冲区频繁变满,此代码是否会占用CPU?

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

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

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