一、裝置終端
class deviceclient {
int deviceid;
int ip;
int port;
char connectid[16];
time_t lasttime;
struct event timeoutev;//超時器
typedef list devicelist;
二、移動控制終端
class userclient {
int userid;
int ip;
int port;
char connectid[16];
time_t lasttime;//接收的時候更新,並開啟超時器
struct event timeoutev;//超時器:如果超時,認為客戶端掉線
typedef listuserlist;
三、udp心跳包設計(服務端)
3.1 udp包接收執行緒
1)recvfrom
2)find connectid 並看看是否是心跳包
3)如果是心跳包,查詢connectid對應的客戶端,如果客戶端存在,則更新lasttime,如果客戶端不存在,則新建客戶端並更新lasttime;
3.2 udp包超時器
1)時間的定義(連續三次收不到心跳包,即超時時間為客戶端心跳包時間的3倍)
2)超時事件到達,則認為客戶端掉線,刪除deviceclient或userclient
四、udp心跳包設計(客戶端)
每隔30秒傳送一次心跳包
五、打洞設計
打洞由移動控制終端或者裝置終端發起。下面以移動控制終端發起為例,詳細說明一下打洞的流程
為了方便描述,定義移動控制終端為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
TCP打洞和UDP打洞
1,tcp協議通訊 現在有兩台電腦a和b。在 假設a的位址為 192.168.0.100 假設b的位址為 192.168.0.102 a想給b傳送乙個字串hello,如果a,b之間採用tcp協議,那麼b收到hello的過程是怎樣的呢?首先建立連線 3次握手成功之後,a和b的鏈結才算成功 然後a在給b...
關於TCP打洞和UDP打洞
解決辦法是 a向b的公網ip傳送乙個資料報,則nat a能接收來自nat b的資料報並 給a了 即b現在能訪問a了 再由s命令b向a的公網ip傳送乙個資料報,則nat b能接收來自nat a的資料報並 給b了 即a現在能訪問b了 以上就是 打洞 的原理。但是tcp和udp在打洞上卻有點不同。這是因為...
UDP打洞原理
許多p2p軟體比如skype,qq,電驢之類需要不同內網的兩台機子進行通訊,而路由器的nat機制決定了內網訪問外網容易,而外網訪問內網困難,那如何才能做到這一點呢?有辦法 打洞 具體實現方法需要一台伺服器,現在假設兩台內網pc,a和b想用埠40000通訊,閘道器分別為nata,natb.伺服器為s,...