如何检查超过1个字节是否可以从Windows套接字读取?

时间:2011-11-30 09:34:08

标签: c++

我正在尝试循环ioctlselectrecv,这耗费时间。有人建议使用selectselect非常快。但问题是我应该在准备接收多个字节后才收到。如果一个字节也可从套接字读取,则select已准备就绪。还有其他选择吗?

1 个答案:

答案 0 :(得分:2)

使用select,并将套接字置于非阻塞模式。 (请参阅fcntl,它可以为您执行此操作。)然后,只需将recv放入大缓冲区即可。如果可用的数据较少,您将得到一个简短的recvrecv将返回它读取的字节数。如果没有可用内容,则recv将失败,errno将为EWOULDBLOCKEAGAIN(同时检查两者)。

recv 可以EAGAIN / EWOULDBLOCK 失败,即使select表示数据可用。

它可以更有效,更容易阅读,然后根据需要在代码中缓冲。

编辑: oops,你在Windows上。同样的想法,除了你需要检查Winsock的错误代码,而不是errnoioctlsocket可以将套接字置于非阻塞模式。 (我不确定Windows是否有fcntl。)