Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 使用select时从套接字读取多少数据_Sockets - Fatal编程技术网

Sockets 使用select时从套接字读取多少数据

Sockets 使用select时从套接字读取多少数据,sockets,Sockets,我正在使用select侦听多个套接字上的数据。当我被告知有可用数据时,我应该阅读多少 我可以循环读取,直到没有更多的数据,处理数据,然后返回select循环。但是,我可以想象,套接字接收数据的速度如此之快,以至于它会暂时“饿死”其他套接字。特别是因为我正在考虑将select也用于线程间通信消息传递样式,所以我希望保持较低的延迟。这是现实中的问题吗 另一种方法是始终读取固定大小的字节,然后返回循环。这里的缺点是,当可用数据超过缓冲区的容量时,会增加开销 这里的最佳实践是什么?不确定这在其他平台上是

我正在使用select侦听多个套接字上的数据。当我被告知有可用数据时,我应该阅读多少

我可以循环读取,直到没有更多的数据,处理数据,然后返回select循环。但是,我可以想象,套接字接收数据的速度如此之快,以至于它会暂时“饿死”其他套接字。特别是因为我正在考虑将select也用于线程间通信消息传递样式,所以我希望保持较低的延迟。这是现实中的问题吗

另一种方法是始终读取固定大小的字节,然后返回循环。这里的缺点是,当可用数据超过缓冲区的容量时,会增加开销


这里的最佳实践是什么?

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

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

这里太常见的方法是读取给定套接字上所有挂起的内容,特别是当您移动到特定于平台的高级轮询API(如和启用边缘触发事件)时。但是,你当然不必!一旦您认为您获得了足够的数据,但不是所有数据,请在某个位置翻转与该套接字相关的一点,然后再执行更多recv2操作,比如在文件描述符检查循环的最后,不要再次调用select2


那么这个问题太笼统了。你的目标是什么?低延迟?高吞吐量?可伸缩性?除了42之外,没有一个单一的答案:

这里太常见的方法是读取给定套接字上挂起的所有内容,特别是当您移动到特定于平台的高级轮询API(如并启用边缘触发事件)时。但是,你当然不必!一旦您认为您获得了足够的数据,但不是所有数据,请在某个位置翻转与该套接字相关的一点,然后再执行更多recv2操作,比如在文件描述符检查循环的最后,不要再次调用select2

那么这个问题太笼统了。你的目标是什么?低延迟?高吞吐量?可伸缩性?没有一个单一的答案,除了42: