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. MATLAB学习笔记(三)——程序设计

    (一)M文件 一.概述 1.自己的体会就是把相应的操作写成一个文本文件,这样子的话方便进行修改(记事本就行了),又可以达到封装的目的,当然我发现2014a版本的Matlab貌似已经采用的面向对象的设计 ...

  2. 导入/导出Excel

    --从Excel文件中,导入数据到SQL数据库中,很简单,直接用下面的语句:/*============================================================ ...

  3. Servlet应用的运行流程

    其中,红色部分为我们开发人员要做的,其他部分是框架做的. 学习就要搞懂整个运行的流程!否则,不利于个人技术的积累!

  4. vi总结

    vi常用命令整理 ★命令模式 移动光标 h 或 向左方向键(←) → 光标向左移动一个字元 j 或 向下方向鍵(↓) → 光标向下移动一个字元 k 或 向上方向鍵(↑) → 光标向上移动一个字元 l ...

  5. SU Demos-02Filtering-07Sumedian

    不足之处,欢迎批评指正. 先看脚本内容: 脚本中用到的4个参数文件,是一系列x,t数据对,数组(x,t) 运行结果,

  6. JAVA定时执行任务的三种方法

    1.利用 java.util.Timer 这个方法应该是最常用的,不过这个方法需要手工启动你的任务 Timer timer=new Timer(); timer.schedule(new ListBy ...

  7. HDU2167 Pebbles(状压DP)

    题目给一张n×n的格子,每个格子都有数字,要从格子中取若干个数字,八个方向相邻的数字不能一起取,问取的数字最大和是多少. 从第一行一行一行看下去,可以发现第1行取哪几列只会影响到第2行,第3行后面的一 ...

  8. BZOJ3830 : [Poi2014]Freight

    首先为了保证发车时间都不同,T[i]=max(T[i],T[i-1]+1) 然后设f[i]表示前i列车回来的最早时刻 f[i]=min(max(T[i],f[j]+i-j-1)+s*2+i-j-1) ...

  9. BZOJ3772: 精神污染

    Description 兵库县位于日本列岛的中央位置,北临日本海,南面濑户内海直通太平洋,中央部位是森林和山地,与拥有关西机场的大阪府比邻而居,是关西地区面积最大的县,是集经济和文化于一体的一大地区, ...

  10. java 枚举类型分析

    最近做android开发,需要用到枚举值,这样可以连续赋值,我按之前c++那样书写,如下所示: public enum ColorSelect { RED_BAGE = 0, GREEN_BAGE, ...