C++模式下从socket中读取所有可用字节的最佳方法

C++模式下从socket中读取所有可用字节的最佳方法,c++,linux,sockets,C++,Linux,Sockets,从阻塞套接字读取所有可用字节的最佳方法是什么?”“可用”表示服务器响应是一组文本行,每行带有“\n”,EOF是一行带有前缀。这个回答的长度总是不同的,所以在阅读之前我不知道。我认为使用selectpoll、epoll和ioctlFIONREAD是最好的方法,对吗?或者可能只是读取当时所有可用的数据,然后检查是否达到EOF,如果未达到EOF,然后再次重复所有数据?是的,听起来更合理。这一切都有意义吗?那么,什么是最有效的方法呢?如果您正在执行阻塞读取,那么使用select/epoll没有什么意义

从阻塞套接字读取所有可用字节的最佳方法是什么?”“可用”表示服务器响应是一组文本行,每行带有“\n”,EOF是一行带有前缀。这个回答的长度总是不同的,所以在阅读之前我不知道。我认为使用selectpoll、epoll和ioctlFIONREAD是最好的方法,对吗?或者可能只是读取当时所有可用的数据,然后检查是否达到EOF,如果未达到EOF,然后再次重复所有数据?是的,听起来更合理。这一切都有意义吗?那么,什么是最有效的方法呢?

如果您正在执行阻塞读取,那么使用select/epoll没有什么意义

ioctlFIONREAD是一个非常无用的调用,因为当它返回更多数据时,可能已经到达内核套接字缓冲区

阻止读取很容易:只需继续读取用户空间套接字缓冲区,直到找到消息终止符


理想情况下,您使用的网络组件不应该关心套接字是处于阻塞模式还是处于非阻塞模式:应该有一个在套接字准备好读取时调用的函数。在阻塞模式下,无论套接字是否准备就绪,您都会调用此函数,如果没有可用数据,它只会在读取时阻塞。

您好slowcheetah,我个人建议使用epoll。只要FD上的数据可用,Epoll就会通知您。您在客户端内部维护一个缓冲区,并存储从服务器读取的值。从缓冲区中,您可以进行验证。传统的阻塞读取直到EOF或非阻塞选择读取可用,如果EOF停止,会有什么问题?Govind Raj,谢谢,是的,我知道epoll的好处,但我的代码也应该在os x上工作,但epoll不受支持,因此我必须使用select.Serge Ballesta,我想读整个区块,然后分析它。在您的情况下,我必须在每次读取后解析它,并确保达到EOF,这并不复杂,但我需要一些更好的方法。我在上面的问题中也提出了这种方法。Serge Ballesta,这都是因为我想把这个方法添加到一些类中,比如readAllAvailablestd::vector&,但不是在协议实现中。所以在协议实现中,我调用readAllAvailable,获取所有字节,然后检查是否有EOF,如果没有,则再次调用readAllAvailable。一块一块地读,然后每次都分析,这似乎不太好。