在 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 对话,使用常规的、阻塞的 write
和 read
调用是很好的——write
将立即 return(只要发送缓冲区中有 space)并且 read
将阻塞直到接收到某些数据(或发生错误)。这里明显的缺点是在您等待接收时无法发送任何内容。这适用于大多数同步(“request-reply”)类型的通信协议。
select
对于在更复杂的场景中管理多个并行 I/O 操作很有用。例如,如果您必须发送和接收两个彼此 不同步 的流 - 这意味着即使接收被阻止,发送也可以无限期地继续,反之亦然,那么您可以select
在socket fd 上同时读写,然后执行write
、read
或两者,取决于哪一侧可用,不会阻塞。
我是第一次用 C++ 编写一个简单的单线程 tcp 客户端,它从服务器请求一些数据,主线程应该阻塞,直到我们从服务器收到响应或失败。所以我打算做的是下面..
write(......) // writes struct as char buffer
read(.....) // blocks until data is received or error
所以我的问题是,这种方法是否正确?我觉得应该有使用 select
的替代解决方案,其中客户端将阻塞 select
直到套接字变得可读。任何人都可以建议在这种情况下什么是最好的,为什么?
提前致谢。
对于简单的客户端 TCP 对话,使用常规的、阻塞的 write
和 read
调用是很好的——write
将立即 return(只要发送缓冲区中有 space)并且 read
将阻塞直到接收到某些数据(或发生错误)。这里明显的缺点是在您等待接收时无法发送任何内容。这适用于大多数同步(“request-reply”)类型的通信协议。
select
对于在更复杂的场景中管理多个并行 I/O 操作很有用。例如,如果您必须发送和接收两个彼此 不同步 的流 - 这意味着即使接收被阻止,发送也可以无限期地继续,反之亦然,那么您可以select
在socket fd 上同时读写,然后执行write
、read
或两者,取决于哪一侧可用,不会阻塞。