我想使用select调用从我的写套接字fd发送()数据。我将使用非阻塞套接字实现。哪个实现更好。
while(u4BytesSent < u2BufLen)
{
i4RetVal = send(sockFd, au1Buf + u4BytesSent, (u2BufLen - u4BytesSent));
if(i4RestVal == -1 && errno != EWOULDBLOCK)
{
break;
}
i4BytesSent = i4BytesSent + i4RetVal;
}
如果发送缓冲区频繁满,这个代码会占用CPU吗?
或
选择无限超时呼叫。select()在占用CPU的情况下会有更好的性能吗?
如果发送缓冲区频繁满,这个代码会占用CPU吗?
是的。它也会表现不正确(很可能崩溃),因为它最终会在错误时反复将-1
的错误返回值添加到i4BytesSent
。
使用select()
与无限(或,至少,很长)超时应该工作良好。您的进程将休眠,直到套接字上的数据可用。
考虑到你所描述的,你最好不要使用非阻塞套接字。如果您要做的只是将它们包装在select()
中以使写操作阻塞,那么当然没有意义!