我正在尝试循环ioctlselect
或recv
,这耗费时间。有人建议使用select
。 select
非常快。但问题是我应该在准备接收多个字节后才收到。如果一个字节也可从套接字读取,则select
已准备就绪。还有其他选择吗?
答案 0 :(得分:2)
使用select
,并将套接字置于非阻塞模式。 (请参阅fcntl
,它可以为您执行此操作。)然后,只需将recv
放入大缓冲区即可。如果可用的数据较少,您将得到一个简短的recv
,recv
将返回它读取的字节数。如果没有可用内容,则recv
将失败,errno
将为EWOULDBLOCK
或EAGAIN
(同时检查两者)。
recv
可以以EAGAIN
/ EWOULDBLOCK
失败,即使select
表示数据可用。
它可以更有效,更容易阅读,然后根据需要在代码中缓冲。
编辑: oops,你在Windows上。同样的想法,除了你需要检查Winsock的错误代码,而不是errno
,ioctlsocket
可以将套接字置于非阻塞模式。 (我不确定Windows是否有fcntl
。)