网络编程-socket编程调用recv后,如何判断缓冲区是否还有数据,需要自己定协议吗

发布于 2017-01-20 10:11:43 字数 0 浏览 1203 评论 2

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

浮生未歇 2017-10-23 15:31:56

可以使用select或者poll判断socket是否可读,以poll为例,可以:

struct pollfd fds[1];

fds[0].fd = sock_fd; //需要读的socket描述符
fds[0].events = POLLIN;
ret = poll(fds, 1, 0);
if (ret > 0 && (fds[0].revents & POLLIN)) {
recv(sock_fd, ...); //socket缓冲区可读
}

想挽留 2017-05-08 16:24:50

楼上的select或poll是异步socket模型的方法来实现你的需求,如果不想使用异步socket模型,其实可以采用如下方法:

由于recv返回的是实际从socket接收缓冲区copy到目标接收缓冲区的字节数,那么,你可以将recv的目标缓冲区的大小和期望接收的字节数两个参数,设置得足够大一些,若recv的返回值小于期望接收的字节数,则表示缓冲区已经为空了。

另外一种方法: 为阻塞socket设置超时,如果recv接收超时,则表示缓冲区已经没有数据了。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文