linux udp打洞 UDP打洞和心跳包設計

2021-10-13 09:22:46 字數 1245 閱讀 9332

一、裝置終端

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,...