使用select时从套接字读取多少内容

时间:2011-12-09 13:44:55

标签: sockets

我正在使用select()来侦听多个套接字上的数据。当我收到有关可用数据的通知时,我应该read()多少?

  • 我可以遍历read(),直到没有更多数据,处理数据,然后返回到选择循环。但是,我可以想象套接字收到如此多的数据以至于暂时“饿死”了其他套接字。特别是因为我正在考虑使用select也用于线程间通信(消息传递方式),我想保持低延迟。这实际上是一个问题吗?

  • 另一种方法是始终读取固定大小的字节,然后返回循环。当有更多数据可用而不适合我的缓冲区时,这里的缺点会增加。

这里的最佳做法是什么?

2 个答案:

答案 0 :(得分:0)

不确定这是如何在其他平台上实现的,但在Windows上,ioctlsocket(FIONREAD)调用会告诉您一次调用recv()可以读取多少字节。实际调用recv()时,套接字队列中可能有更多字节。下一次调用select()将报告套接字仍然可读。

答案 1 :(得分:0)

这里过于常见的方法是读取给定套接字上待处理的所有内容,特别是如果移动到特定于平台的高级轮询API,如kqueue(2)epoll(7)启用边缘触发事件。但是,你当然不必!一旦你认为你有足够的数据(但不是所有的东西),就在某处翻转与该套接字关联的一点,然后在文件描述符的最后再做更多的recv(2)检查循环,而不再调用select(2)

然后问题太笼统了。你的目标是什么?低延迟?高吞吐量?可扩展性?一切都没有单一答案(好吧,除了42:)