我决定在我的项目中使用 async io 并简单地执行一个单线程循环,在其中我尝试从每个打开的套接字中读取每帧的一些数据。这工作得很好,总的来说我现在对它很满意。问题是我在使用异步套接字时遇到的奇怪问题。
我有这样的代码:
accept a connection...
fcntl(O_NONBLOCK) on the client socket...
int rc;
if((rc = recv(socket))>0)
process data
if rc == 0
close socket and cleanup
问题是即使我知道连接没有关闭,有时我也会得到 rc == 0 。如果我不清理,那么我的应用程序将正常工作。但是,如果我进行清理,那么客户端在连接建立之前就会收到断开连接。
所以我的问题是:我是否必须在执行 recv 之前以某种方式检查套接字是否已准备好才能从中获得正确的返回值?
我能找到的大部分信息都是不确定的。我找到了对 select() 的引用,但它似乎会阻塞,直到套接字上的状态发生变化 - 但我需要套接字是非阻塞的。
我正在寻找的只是直观的行为,如果有数据,则将其读取到缓冲区并 recv 返回读取的字节数,如果没有数据则返回-1,如果套接字断开连接,则应返回0。
在调用 recv 以使其按预期工作之前,我是否必须对套接字执行任何其他操作?