一、設備終端
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