void DataHandle::recv() {
    sleep(2);
    _data_router -> readInfoHw(&mInfo);
    ALOGD(SYS_LOG_TAG "readInfoHW: conn=%d, init=%d, numC=%d, MAC=%s",
            mInfo.isBTConnected, mInfo.isBTInitialized, mInfo.numClient, mInfo.BTMACaddr);
    ALOGD(SYS_LOG_TAG "readInfoHW: sentP=%lld, recvP=%lld, dropP=%lld, sentB=%lld, recvB=%lld",
            mInfo.sentPacket, mInfo.recvPacket, mInfo.dropPacket,
            mInfo.sentByte, mInfo.recvByte);
    ALOGD(SYS_LOG_TAG "before begin recv.........................");
    bool mac_st = false;
    if (strlen(mInfo.BTMACaddr) > 0) {
        mac_st = SysWatcher::instance()->setMacAddr(mInfo.BTMACaddr);
    }
    int dfd = _data_router->getReadFd();
    struct epoll_event event;
    struct epoll_event * _events;
    int efd = epoll_create1(0);
    if (efd == -1) {
        perror("epoll_create");
        abort();
    }
    event.data.fd = dfd;
    event.events = EPOLLIN | EPOLLET;
    int s = epoll_ctl(efd, EPOLL_CTL_ADD, dfd, &event);
    if (s == -1) {
        perror("epoll_ctl");
        abort();
    }
    _events = (epoll_event *) calloc(MAXEVENTS, sizeof(event));
    int done;
    string message;
    const int RECV_BUF_DEPTH = 200;
    char buf[RECV_BUF_DEPTH] = { 0 };
    while (1) {

int n, i;
n = epoll_wait(efd, _events, MAXEVENTS, -1);
for (i = 0; i < n; i++) {
if ((_events[i].events & EPOLLERR)
|| (_events[i].events & EPOLLHUP) || (!(_events[i].events
& EPOLLIN))) {
ALOGD(SYS_LOG_TAG " SysWatcher::EPOLLERR||EPOLLHUP||!EPOLLIN\n");
fprintf(stderr, "epoll error\n");
close(_events[i].data.fd);
continue;
} else if (dfd == _events[i].data.fd) {
ssize_t count;
memset(buf, 0, RECV_BUF_DEPTH);
/*
count = read(_events[i].data.fd, buf, RECV_BUF_DEPTH);
if (count == -1) {
// If errno == EAGAIN, that means we have read all data. So go back to the main loop.
if (errno != EAGAIN) {
perror("read");
done = 1;
ALOGD(SYS_LOG_TAG " SysWatcher:: errno != EAGAIN\n");
}
ALOGD(SYS_LOG_TAG " SysWatcher:: errno == EAGAIN\n");
break;
} else if (count == 0) { //��ʱ
// End of file. The remote has closed the connection.
done = 1;
ALOGD(SYS_LOG_TAG "SysWatcher::recv() DISCONNECTED.");
break;
}*/

message = string(buf);
ALOGD(SYS_LOG_TAG " SysWatcher Recive Data from BLEPare data=%s\n", buf);
bool dis_st = RouterSysWatcher::dispath(message);
message = "";
memset(buf, 0, RECV_BUF_DEPTH);
if (dis_st) {
ALOGD(SYS_LOG_TAG "dispath sucess! dis_ret =%d", dis_st);
} else {
 
ALOGD(SYS_LOG_TAG "dispath error! dis_ret =%d", dis_st);
continue;
}
ALOGD(SYS_LOG_TAG " Epoll test, buf = %s, count =%d", buf, count);
}
}
_data_router -> readInfoHw(&mInfo);
if (strlen(mInfo.BTMACaddr) > 0 and mac_st == false) {
mac_st = SysWatcher::instance()->setMacAddr(mInfo.BTMACaddr);
ALOGD(SYS_LOG_TAG "......readInfoHW: conn=%d, init=%d, numC=%d, MAC=%s",
mInfo.isBTConnected, mInfo.isBTInitialized, mInfo.numClient, mInfo.BTMACaddr);
}
}
free(_events);
_events = 0;
close(dfd);

}

epoll 实际使用的更多相关文章

  1. 从I/O复用谈epoll为什么高效

    上一篇文章中,谈了一些网络编程的基本概念.在现实使用中,用的最多的就是I/O复用了,无非就是select,poll,epoll 很多人提到网络就说epoll,认为epoll效率是最高的.单纯的这么认为 ...

  2. select、poll、epoll之间的区别总结

    select.poll.epoll之间的区别总结 05/05. 2014 select,poll,epoll都是IO多路复用的机制.I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪 ...

  3. (转载) Linux IO模式及 select、poll、epoll详解

    注:本文是对众多博客的学习和总结,可能存在理解错误.请带着怀疑的眼光,同时如果有错误希望能指出. 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案 ...

  4. linux下select/poll/epoll机制的比较

    select.poll.epoll简介 epoll跟select都能提供多路I/O复用的解决方案.在现在的Linux内核里有都能够支持,其中epoll是Linux所特有,而select则应该是POSI ...

  5. epoll LT/ET 深度剖析

    EPOLL事件的两种模型: Level Triggered (LT) 水平触发 .socket接收缓冲区不为空 有数据可读 读事件一直触发 .socket发送缓冲区不满 可以继续写入数据 写事件一直触 ...

  6. 非阻塞/异步(epoll) openssl

    前段时间在自己的异步网络框架handy中添加openssl的支持,当时在网络上搜索了半天也没有找到很好的例子,后来自己慢慢的摸索,耗费不少时间,终于搞定.因此把相关的资料整理一下,并给出简单的例子,让 ...

  7. select,epoll,poll比较

    介绍和比较 http://www.cnblogs.com/maociping/p/5132583.html 比较 http://www.dataguru.cn/thread-336032-1-1.ht ...

  8. Linux epoll

    一. epoll函数集 epoll主要有三个函数: 1. int epoll_create(int size); 创建一个epoll的句柄,size用来告诉内核这个监听的数目一共有多大.这个参数不同于 ...

  9. linux下epoll实现机制

    linux下epoll实现机制 原作者:陶辉 链接:http://blog.csdn.net/russell_tao/article/details/7160071 先简单回顾下如何使用C库封装的se ...

  10. select、poll、epoll之间的区别总结[整理]

    select,poll,epoll都是IO多路复用的机制.I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作.但select ...

随机推荐

  1. eclipse下导入工程的小问题

  2. 【HTML5】Canvas画布

    什么是 Canvas? HTML5 的 canvas 元素使用 JavaScript 在网页上绘制图像. 画布是一个矩形区域,您可以控制其每一像素. canvas 拥有多种绘制路径.矩形.圆形.字符以 ...

  3. 补间动画TweenAnimation

    animation_translate = AnimationUtils.loadAnimation(MainActivity.this, R.anim.transalte); imageview.s ...

  4. MySql的日常管理

    连接故障恢复 MySQL套接字被误删 在UNIX系统上,本地客户以localhost为主机名建立MySQL连接,该过程是通过一个UNIX套接字文件(比如说,/tmp/mysql.sock文件)实现的. ...

  5. AppleWatch开发教程之Watch应用对象新增内容介绍以及编写运行代码

    AppleWatch开发教程之Watch应用对象新增内容介绍以及编写运行代码 添加Watch应用对象时新增内容介绍 Watch应用对象添加到创建的项目中后,会包含两个部分:Watch App 和 Wa ...

  6. POJ2817 WordStack(状压DP)

    题目给几个字符串,可以给它们添加前导空格,然后排列,计算每一个字符串和前一个字符串相同非空格字符相等的个数,求可能的最大个数. 状态DP: d[S][i][j]表示已经用的字符串集合S且排列的最后一个 ...

  7. NOI2012 : 迷失游乐园

    终于补完NOI2012了好开心~ 题目大意:给定一棵树或者环套外向树,求出从中随机选一条简单路径的期望长度,环上点数不超过20. 设 d[x]表示x的度数,ch[x]表示x孩子个数 up[x]表示x向 ...

  8. TYVJ P1004 滑雪 Label:记忆化搜索

    背景 成成第一次模拟赛 第三道 描述     trs喜欢滑雪.他来到了一个滑雪场,这个滑雪场是一个矩形,为了简便,我们用r行c列的矩阵来表示每块地形.为了得到更快的速度,滑行的路线必须向下倾斜.    ...

  9. 【wikioi】1012 最大公约数和最小公倍数问题

    题目链接 算法:辗转相除(欧几里得) gcd(a, b)是a和b最小公倍数, lcm(a, b)是a和b的最大公倍数 gcd(a, b) == gcd(b, a%b) 时间复杂度: O(lgb) 具体 ...

  10. 【BZOJ】1834: [ZJOI2010]network 网络扩容(最大流+费用流)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1834 我又思考人生了T_T,nd的数组开小了,一直wa,调了一个小时才发现啊!!!!!我一直以为我的 ...