可以使用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缓冲区可读}
楼上的select或poll是异步socket模型的方法来实现你的需求,如果不想使用异步socket模型,其实可以采用如下方法:
由于recv返回的是实际从socket接收缓冲区copy到目标接收缓冲区的字节数,那么,你可以将recv的目标缓冲区的大小和期望接收的字节数两个参数,设置得足够大一些,若recv的返回值小于期望接收的字节数,则表示缓冲区已经为空了。
另外一种方法: 为阻塞socket设置超时,如果recv接收超时,则表示缓冲区已经没有数据了。
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
暂无简介
文章 0 评论 0
接受
发布评论
评论(2)
可以使用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缓冲区可读
}
楼上的select或poll是异步socket模型的方法来实现你的需求,如果不想使用异步socket模型,其实可以采用如下方法:
由于recv返回的是实际从socket接收缓冲区copy到目标接收缓冲区的字节数,那么,你可以将recv的目标缓冲区的大小和期望接收的字节数两个参数,设置得足够大一些,若recv的返回值小于期望接收的字节数,则表示缓冲区已经为空了。
另外一种方法: 为阻塞socket设置超时,如果recv接收超时,则表示缓冲区已经没有数据了。