一、设备终端
class DeviceClient {
int deviceID;
int IP;
int port;
char connectID[16];
time_t lastTime;
struct event timeoutEv;//超时器
};
typedef list<DeviceClient *> deviceList;

二、移动控制终端
class UserClient {
int userID;
int IP;
int port;
char connectID[16];
time_t lastTime;//接收的时候更新,并开启超时器
struct event timeoutEv;//超时器:如果超时,认为客户端掉线
};

typedef list<UserClient *>userList;

三、UDP心跳包设计(服务端)
http://blog.csdn.net/liuguanghui1988/article/details/7090531
3.1 UDP包接收线程
1)recvfrom
2)find connectID 并看看是否是心跳包
3)如果是心跳包,查找connectID对应的客户端,如果客户端存在,则更新lastTime,如果客户端不存在,则新建客户端并更新lastTime;

3.2 UDP包超时器
1)时间的定义(连续三次收不到心跳包,即超时时间为客户端心跳包时间的3倍)
2)超时事件到达,则认为客户端掉线,删除DeviceClient或UserClient

四、UDP心跳包设计(客户端)
每隔30秒发送一次心跳包

五、打洞设计
http://www.cppblog.com/Lee7/archive/2008/01/25/41850.html
打洞由移动控制终端或者设备终端发起。下面以移动控制终端发起为例,详细说明一下打洞的流程
为了方便描述,定义移动控制终端为UserClient,设备终端为DeviceClient,服务端为Server
流程如下:
1)UserClient Login
2)DeviceClient Login
3)UserClient send "P2P_Punch deviceID" Message to Server
4)Server send "P2P_WantYou userID" Message to DeviceClient
5)UserClient send "P2P_Message msg" Message to DeviceClient
6)DeviceClient send "P2P_Message msg" Message to UserClient

最新文章

  1. Lind.DDD~实体属性变更追踪器的实现
  2. ---Shell的数组遍历
  3. VS2008设置断点不命中
  4. [deviceone开发]-直播APP心形点赞动画示例
  5. Xcode 的ARC转化功能以及跟非ARC共存方法
  6. java list&lt;int&gt;报错
  7. HNOI2004宠物收养所(平衡树)
  8. Linux Bash命令关于程序调试详解
  9. [Immutable.js] Converting Immutable.js Structures to Javascript and other Immutable Types
  10. Eclipse perl的IDE环境插件-EPIC
  11. js同时使用多个分隔符分割字符串.
  12. Python爬虫开源项目代码,爬取微信、淘宝、豆瓣、知乎、新浪微博、QQ、去哪网等 代码整理
  13. C#一例绘制字体不清晰的解决办法
  14. BMFont制作美术字体
  15. iOS处理视图上同时添加单击与双击手势的冲突问题
  16. VS Code .vue文件代码缩进以及格式化代码
  17. 破解Linux系统root用户密码
  18. C11线程管理:条件变量
  19. redis的使用和安装,redis基础和高级部分
  20. phpstudy mysql无法启动

热门文章

  1. 推荐几款jQuery表格插件
  2. perl 监控数据库用到的数据结构
  3. 结论: blocking_query 是当前堵塞其他会话正在运行的SQL.而不是原始堵塞SQL
  4. 子查询解嵌套in改写为exists
  5. 【HDOJ】2955 Robberies
  6. wikioi 1514 and ZJOI2006 书架
  7. smoke kde binding
  8. java 全角半角转换函数
  9. HDU-2975 Billboard
  10. $(function(){})里面不能声明定义函数