在 linux 上的单线程 c++ tcp 客户端中阻塞读取与 select

Blocking read vs select in single threaded c++ tcp client on linux

我是第一次用 C++ 编写一个简单的单线程 tcp 客户端,它从服务器请求一些数据,主线程应该阻塞,直到我们从服务器收到响应或失败。所以我打算做的是下面..

write(......) // writes struct as char buffer
read(.....) // blocks until data is received or error

所以我的问题是,这种方法是否正确?我觉得应该有使用 select 的替代解决方案,其中客户端将阻塞 select 直到套接字变得可读。任何人都可以建议在这种情况下什么是最好的,为什么? 提前致谢。

对于简单的客户端 TCP 对话,使用常规的、阻塞的 writeread 调用是很好的——write 将立即 return(只要发送缓冲区中有 space)并且 read 将阻塞直到接收到某些数据(或发生错误)。这里明显的缺点是在您等待接收时无法发送任何内容。这适用于大多数同步(“request-reply”)类型的通信协议。

select 对于在更复杂的场景中管理多个并行 I/O 操作很有用。例如,如果您必须发送和接收两个彼此 不同步 的流 - 这意味着即使接收被阻止,发送也可以无限期地继续,反之亦然,那么您可以select 在socket fd 上同时读写,然后执行writeread 或两者,取决于哪一侧可用,不会阻塞。