确定准备好进行 recv() 处理的字节数
我可以使用 select()
来确定对 recv()
的调用是否会阻塞,但是一旦我确定有字节要读取,有没有办法在实际调用 recv()
之前查询当前有多少字节可用?
I can use select()
to determine if a call to recv()
would block, but once I've determined that there are bytes to be read, is there a way to query how many bytes are currently available before I actually call recv()
?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
如果您的操作系统提供了它(大多数操作系统都提供了),则可以使用 ioctl(..,FIONREAD,..):
Windows 提供了类似的 ioctlsocket(..,FIONREAD,..),它需要一个指向 unsigned long 的指针
: call 应该适用于套接字和其他一些 fd,但不是所有 fd。我相信它可以在您可能使用的几乎任何免费的类 UNIX 操作系统上与 TCP 套接字配合良好。对于 UDP 套接字,它的语义有点不同:对于它们来说,它告诉您下一个数据报中的字节数。
Windows 上的 ioctlsocket 调用(显然)仅适用于套接字。
If your OS provides it (and most do), you can use ioctl(..,FIONREAD,..):
Windows provides an analogous ioctlsocket(..,FIONREAD,..), which expects a pointer to unsigned long:
The ioctl call should work on sockets and some other fds, though not on all fds. I believe that it works fine with TCP sockets on nearly any free unix-like OS you are likely to use. Its semantics are a little different for UDP sockets: for them, it tells you the number of bytes in the next datagram.
The ioctlsocket call on Windows will (obviously) only work on sockets.
不,协议需要确定这一点。例如:
No, a protocol needs to determine that. For example: