我想从我的写套接字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占用性能?
答案 0 :(得分:1)
如果发送缓冲区频繁变满,此代码是否会占用CPU?
是。它也会表现不正确(最有可能崩溃),因为它会在错误时反复将-1
的错误返回值添加到i4BytesSent
。
使用select()
无限(或至少,非常长)超时应该可以正常工作。您的进程将一直睡眠,直到套接字上有数据可用。
鉴于您所描述的内容,最好不要使用非阻塞套接字。如果您要做的只是将它们包装在select()
中以使写入操作无论如何都是阻塞的,那肯定没有意义!