【发布时间】:2014-03-26 06:40:25
【问题描述】:
在 Berkeley 套接字中,recv 函数是否设置了 MSG_WAITALL 标志,取代了多个读取函数,直到请求的全部数据都被读取?
我的意思是 recv 函数是否在一次调用中读取了由大小确定的整个块,而 read 函数可能会读取部分数据块,我需要在循环中多次调用它,直到读取整个块?
【问题讨论】:
标签: sockets
在 Berkeley 套接字中,recv 函数是否设置了 MSG_WAITALL 标志,取代了多个读取函数,直到请求的全部数据都被读取?
我的意思是 recv 函数是否在一次调用中读取了由大小确定的整个块,而 read 函数可能会读取部分数据块,我需要在循环中多次调用它,直到读取整个块?
【问题讨论】:
标签: sockets
是的,MSG_WAITALL 告诉recv() 等待,直到所有请求的字节都被读取。但是,它只支持阻塞模式而不支持非阻塞模式,它只适用于面向流的套接字,如 TCP。即便如此,您仍然需要循环,例如在 Linux 上,如果 recv() 被信号中断并且必须再次调用才能继续阅读。
【讨论】: