UDP 打洞示例 包含 服务器 客户端

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 客户端示例:     [cpp] view plain copy     #include "Net.h"   #include "../p2pInfo.h"      int main()   {       CUdp  udp;       if (0!=udp.

客户端示例:

 

 

[cpp]  view plain  copy
 
 在CODE上查看代码片派生到我的代码片
  1. #include "Net.h"  
  2. #include "../p2pInfo.h"  
  3.   
  4. int main()  
  5. {  
  6.     CUdp  udp;  
  7.     if (0!=udp.Open(16888))  
  8.     {  
  9.         printf("client udp open failed \n");  
  10.         return -1;  
  11.     }  
  12.   
  13.     P2P_CLIENT_INFO clientInfo;  
  14.     memset(&clientInfo,0,sizeof(P2P_CLIENT_INFO));  
  15.   
  16.     clientInfo.nClientPort=16888;  
  17.     clientInfo.nID=0;  
  18.     sprintf(clientInfo.sClientIP,"%s","10.10.2.161");  
  19.   
  20.     P2P_CMD_HEAD cmdHead;  
  21.   
  22.     cmdHead.nCmd=P2P_CMD_REGISTER_REQ;  
  23.     cmdHead.nPayloadLen=sizeof(P2P_CLIENT_INFO);  
  24.     memcpy(cmdHead.sPayLoad,&clientInfo,sizeof(P2P_CLIENT_INFO));  
  25.   
  26.     long lDestIP=0;  
  27.     CBSocket::ConvertStringToIP((int*)&lDestIP,"114.247.165.37");  
  28.     int nRet=0;  
  29.     nRet=udp.Send((unsigned char *)&cmdHead,CMD_HEAD_LEN+cmdHead.nPayloadLen,lDestIP,P2P_SERVER_PORT);  
  30.     printf("send register len %d \n",nRet);  
  31.     nRet=udp.Recv();  
  32.     if (nRet>0)  
  33.     {  
  34.         printf("recv data \n");  
  35.     }  
  36.     else  
  37.     {  
  38.         printf("recv P2P_CMD_REGISTER_ACK time out \n");  
  39.         return 0;  
  40.     }     
  41.   
  42.       
  43.     P2P_CLIENT_INFO remoteClientInfo;  
  44.     memset(&remoteClientInfo,0,sizeof(P2P_CLIENT_INFO));  
  45.     P2P_CMD_HEAD recvHead;  
  46.     memset(&recvHead,0,sizeof(P2P_CMD_HEAD));  
  47.   
  48.     while (1)  
  49.     {  
  50.         cmdHead.nCmd=P2P_CMD_COMUNICATION_REQ;  
  51.         cmdHead.nValue=1;    // remote id  
  52.         cmdHead.nPayloadLen=sizeof(P2P_CLIENT_INFO);  
  53.   
  54.         nRet=udp.Send((unsigned char *)&cmdHead,CMD_HEAD_LEN+cmdHead.nPayloadLen,lDestIP,P2P_SERVER_PORT);  
  55.         printf("send commuication len %d \n",nRet);  
  56.         nRet=udp.Recv();          
  57.           
  58.         if (nRet>0)  
  59.         {  
  60.             memcpy(&recvHead,udp.GetBuffer(),nRet);  
  61.             if (0==recvHead.nValue)  
  62.             {             
  63.                 memcpy(&remoteClientInfo,recvHead.sPayLoad,sizeof(P2P_CLIENT_INFO));  
  64.                 printf("recv P2P_CMD_COMUNICATION_ACK remote ip:%s port:%d\n",  
  65.                     remoteClientInfo.sClientPublicIP,remoteClientInfo.nClientPublicPort);  
  66.                 break;  
  67.             }  
  68.             usleep(100*1000);  
  69.         }  
  70.         else  
  71.         {  
  72.             printf("recv P2P_CMD_COMUNICATION_ACK time out \n");              
  73.         }  
  74.     }  
  75.       
  76.       
  77.   
  78.     // send udp hole to remote ip  
  79.     CBSocket::ConvertStringToIP((int*)&lDestIP,remoteClientInfo.sClientPublicIP);  
  80.     cmdHead.nCmd=P2P_CMD_UDP_HOLE_REQ;  
  81.     cmdHead.nPayloadLen=0;  
  82.     udp.Send((unsigned char *)&cmdHead,CMD_HEAD_LEN,lDestIP,remoteClientInfo.nClientPublicPort);  
  83.     usleep(1000*1000);  
  84.     udp.Send((unsigned char *)&cmdHead,CMD_HEAD_LEN,lDestIP,remoteClientInfo.nClientPublicPort);  
  85.     usleep(1000*1000);  
  86.     udp.Send((unsigned char *)&cmdHead,CMD_HEAD_LEN,lDestIP,remoteClientInfo.nClientPublicPort);  
  87.   
  88.       
  89.     nRet=udp.Recv();  
  90.     if (nRet>0)  
  91.     {  
  92.         memcpy(&recvHead,udp.GetBuffer(),nRet);  
  93.           
  94.         if (recvHead.nCmd==P2P_CMD_UDP_HOLE_ACK || recvHead.nCmd==P2P_CMD_UDP_HOLE_REQ)  
  95.         {  
  96.             printf("recv P2P_CMD_UDP_HOLE  udp hole success\n");  
  97.         }  
  98.     }  
  99.     else  
  100.     {  
  101.         printf("P2P_CMD_UDP_HOLE recv out \n");  
  102.         return 0;  
  103.     }     
  104.       
  105.       
  106.     return 0;  
  107. }  

 

 

服务器端示例: 

 

[cpp]  view plain  copy
 
 在CODE上查看代码片派生到我的代码片
  1. #include "Net.h"  
  2. #include "../p2pInfo.h"  
  3.   
  4. #define MAX_CLIENT_COUNT 16  
  5.   
  6. P2P_CLIENT_INFO* pClientList[MAX_CLIENT_COUNT];  
  7.   
  8. void AddClient(P2P_CLIENT_INFO* pClientInfo)  
  9. {  
  10.     for(int i=0;i<MAX_CLIENT_COUNT;i++)  
  11.     {  
  12.         if (!pClientList[i])  
  13.         {  
  14.             P2P_CLIENT_INFO* pClient=new P2P_CLIENT_INFO;  
  15.             memcpy(pClient,pClientInfo,sizeof(P2P_CLIENT_INFO));  
  16.             pClientList[i]=pClient;  
  17.             return;  
  18.         }  
  19.     }  
  20. }  
  21.   
  22. P2P_CLIENT_INFO* FindClient(int nID)  
  23. {  
  24.     for(int i=0;i<MAX_CLIENT_COUNT;i++)  
  25.     {  
  26.         if (pClientList[i])  
  27.         {  
  28.             if (nID==pClientList[i]->nID)  
  29.             {  
  30.                 return pClientList[i];  
  31.             }  
  32.         }  
  33.     }  
  34.     return NULL;  
  35. }  
  36.   
  37. P2P_CLIENT_INFO* FindClient(long ip, unsigned short nPort)  
  38. {  
  39.     for(int i=0;i<MAX_CLIENT_COUNT;i++)  
  40.     {  
  41.         if (pClientList[i])  
  42.         {  
  43.             int nIp=0;  
  44.             CBSocket::ConvertStringToIP(&nIp,pClientList[i]->sClientPublicIP);  
  45.             if (nPort==pClientList[i]->nClientPublicPort && ip==nIp)  
  46.             {  
  47.                 return pClientList[i];  
  48.             }  
  49.         }  
  50.     }  
  51.     return NULL;  
  52. }  
  53.   
  54.   
  55. int main()  
  56. {  
  57.     CUdp udp;  
  58.     udp.Open(P2P_SERVER_PORT);  
  59.     int nRet=0;  
  60.     P2P_CMD_HEAD* pCmdHead=new P2P_CMD_HEAD;  
  61.     P2P_CMD_HEAD* pSendCmdHead=new P2P_CMD_HEAD;  
  62.     memset(pCmdHead,0,sizeof(P2P_CMD_HEAD));  
  63.     memset(pSendCmdHead,0,sizeof(P2P_CMD_HEAD));  
  64.       
  65.     long lRemoteIP=0;  
  66.     unsigned short nRemotePort=0;  
  67.   
  68.   
  69.     int i=0;  
  70.     for (i = 0; i <16; i++)  
  71.     {  
  72.         pClientList[i]=NULL;  
  73.     }  
  74.       
  75.       
  76.     while (1)  
  77.     {  
  78.         nRet=udp.Recv(lRemoteIP,nRemotePort);  
  79.         if (nRet>0)  
  80.         {  
  81.             memcpy(pCmdHead,udp.GetBuffer(),nRet);  
  82.   
  83.             switch (pCmdHead->nCmd)  
  84.             {  
  85.                 case P2P_CMD_REGISTER_REQ:  
  86.                     {  
  87.                         printf("recv register req \n");  
  88.                         P2P_CLIENT_INFO* pClient=(P2P_CLIENT_INFO*)pCmdHead->sPayLoad;  
  89.                         CBSocket::ConvertIPToString(lRemoteIP,pClient->sClientPublicIP);  
  90.                         pClient->nClientPublicPort=nRemotePort;  
  91.                         AddClient(pClient);  
  92.   
  93.                         printf("recv command P2P_CMD_REGISTER_REQ from ip:%s port:%d\n",pClient->sClientPublicIP,pClient->nClientPublicPort);  
  94.   
  95.                         pSendCmdHead->nCmd=P2P_CMD_REGISTER_ACK;  
  96.                         pSendCmdHead->nPayloadLen=sizeof(P2P_CLIENT_INFO);  
  97.                         memcpy(pSendCmdHead->sPayLoad,pClient,sizeof(P2P_CLIENT_INFO));  
  98.                         udp.Send((unsigned char *)pSendCmdHead,CMD_HEAD_LEN+pSendCmdHead->nPayloadLen,lRemoteIP,nRemotePort);  
  99.                     }  
  100.                     break;  
  101.                 case P2P_CMD_COMUNICATION_REQ:  
  102.                     {  
  103.                         printf("recv command P2P_CMD_COMUNICATION_REQ\n");  
  104.                         P2P_CLIENT_INFO* pTargetClientInfo=FindClient(pCmdHead->nValue);  
  105.   
  106.                         if (!pTargetClientInfo)  
  107.                         {  
  108.                             printf("not find client info id:%d\n",pCmdHead->nValue);  
  109.                             continue;  
  110.                         }  
  111.   
  112.                         pSendCmdHead->nCmd=P2P_CMD_COMUNICATION_ACK;  
  113.                         pSendCmdHead->nPayloadLen=sizeof(P2P_CLIENT_INFO);  
  114.                         memcpy(pSendCmdHead->sPayLoad,pTargetClientInfo,sizeof(P2P_CLIENT_INFO));  
  115.                         udp.Send((unsigned char *)pSendCmdHead,CMD_HEAD_LEN+pSendCmdHead->nPayloadLen,lRemoteIP,nRemotePort);                          
  116.   
  117.   
  118.   
  119.                         // send to remote client  
  120.                         int nIP=0;  
  121.                         P2P_CLIENT_INFO* pSelfClientInfo=FindClient(lRemoteIP,nRemotePort);  
  122.                         if (pSelfClientInfo)  
  123.                         {  
  124.                             printf("find self client info ip:%s\n",pSelfClientInfo->sClientPublicIP);  
  125.                             memcpy(pSendCmdHead->sPayLoad,pSelfClientInfo,sizeof(P2P_CLIENT_INFO));  
  126.                             CBSocket::ConvertStringToIP(&nIP,pTargetClientInfo->sClientPublicIP);  
  127.                             udp.Send((unsigned char *)pSendCmdHead,CMD_HEAD_LEN+pSendCmdHead->nPayloadLen,nIP,pTargetClientInfo->nClientPublicPort);  
  128.                         }         
  129.                         else  
  130.                         {  
  131.                             printf("not find self client info");  
  132.                         }  
  133.                     }  
  134.                     break;  
  135.                 default:  
  136.                     break;  
  137.             }  
  138.         }  
  139.         else  
  140.         {  
  141.             printf("udp recv time out \n");  
  142.         }  
  143.     }  
  144.     return 0;  
  145. }  



 

示例下载地址:    http://download.csdn.net/detail/mtour/8119489

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
1月前
|
Python
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
使用Python的socket库实现客户端到服务器端的图片传输,包括客户端和服务器端的代码实现,以及传输结果的展示。
127 3
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
|
1月前
|
JSON 数据格式 Python
Socket学习笔记(一):python通过socket实现客户端到服务器端的文件传输
本文介绍了如何使用Python的socket模块实现客户端到服务器端的文件传输,包括客户端发送文件信息和内容,服务器端接收并保存文件的完整过程。
135 1
Socket学习笔记(一):python通过socket实现客户端到服务器端的文件传输
|
1月前
|
网络协议 Unix Linux
一个.NET开源、快速、低延迟的异步套接字服务器和客户端库
一个.NET开源、快速、低延迟的异步套接字服务器和客户端库
|
1月前
|
网络协议 Java API
【网络】TCP回显服务器和客户端的构造,以及相关bug解决方法
【网络】TCP回显服务器和客户端的构造,以及相关bug解决方法
61 2
|
1月前
|
存储 网络协议 Java
【网络】UDP回显服务器和客户端的构造,以及连接流程
【网络】UDP回显服务器和客户端的构造,以及连接流程
51 2
|
1月前
|
存储 网络协议 Java
【网络】UDP和TCP之间的差别和回显服务器
【网络】UDP和TCP之间的差别和回显服务器
65 1
|
30天前
|
安全 区块链 数据库
|
2月前
|
存储 网络协议 算法
UDP 协议和 TCP 协议
本文介绍了UDP和TCP协议的基本结构与特性。UDP协议具有简单的报文结构,包括报头和载荷,报头由源端口、目的端口、报文长度和校验和组成。UDP使用CRC校验和来检测传输错误。相比之下,TCP协议提供更可靠的传输服务,其结构复杂,包含序列号、确认序号和标志位等字段。TCP通过确认应答和超时重传来保证数据传输的可靠性,并采用三次握手建立连接,四次挥手断开连接,确保通信的稳定性和完整性。
88 1
UDP 协议和 TCP 协议
|
20天前
|
网络协议 算法 网络性能优化
|
8天前
|
网络协议 SEO
TCP连接管理与UDP协议IP协议与ethernet协议
TCP、UDP、IP和Ethernet协议是网络通信的基石,各自负责不同的功能和层次。TCP通过三次握手和四次挥手实现可靠的连接管理,适用于需要数据完整性的场景;UDP提供不可靠的传输服务,适用于低延迟要求的实时通信;IP协议负责数据包的寻址和路由,是网络层的重要协议;Ethernet协议定义了局域网的数据帧传输方式,广泛应用于局域网设备之间的通信。理解这些协议的工作原理和应用场景,有助于设计和维护高效可靠的网络系统。
19 4