从阻塞套接字中读取所有可用字节的最佳方法是什么? “可用”表示服务器响应是一堆文本行(每个都带有'\ n'),EOF是带有一些前缀的行。这种反应的长度总是不同的,所以在阅读之前我不知道。我假设使用select()
(poll
,epoll
)然后'ioctl(FIONREAD)'
是最好的方式,我是对的吗?或者可能只是在那一刻阅读所有可用的内容,然后检查是否已达到EOF,如果没有,则再次重复所有内容?是的,这听起来更合理。这一切都有意义吗?那么,最有效的方法是什么?
答案 0 :(得分:1)
如果您正在进行阻止读取,那么使用select
/ epoll
几乎没有意义。
ioctl(FIONREAD)
是一个非常无用的调用,因为当它返回时,更多数据可能已经到达内核套接字缓冲区。
阻止读取很简单:只需将read
保留在用户空间套接字缓冲区中,直到找到消息终止符。
理想情况下,您使用的网络组件不应该关心套接字是处于阻塞还是处于非阻塞模式:应该有一个在套接字准备好读取时调用的函数。在阻塞模式下,无论套接字是否准备好,您都会调用此函数,如果没有可用的数据,它只会在read
上阻塞。