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

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
22天前
|
网络协议 网络架构
【网络编程入门】TCP与UDP通信实战:从零构建服务器与客户端对话(附简易源码,新手友好!)
在了解他们之前我们首先要知道网络模型,它分为两种,一种是OSI,一种是TCP/IP,当然他们的模型图是不同的,如下
|
1月前
|
Java Android开发
Java Socket编程示例:服务器开启在8080端口监听,接收客户端连接并打印消息。
【6月更文挑战第23天】 Java Socket编程示例:服务器开启在8080端口监听,接收客户端连接并打印消息。客户端连接服务器,发送&quot;Hello, Server!&quot;后关闭。注意Android中需避免主线程进行网络操作。
49 4
|
13天前
|
安全 网络协议 网络安全
SSL(Secure Sockets Layer)是一种安全协议,用于在客户端和服务器之间建立加密的通信通道。
SSL(Secure Sockets Layer)是一种安全协议,用于在客户端和服务器之间建立加密的通信通道。
|
13天前
|
网络协议 安全 Python
我们将使用Python的内置库`http.server`来创建一个简单的Web服务器。虽然这个示例相对简单,但我们可以围绕它展开许多讨论,包括HTTP协议、网络编程、异常处理、多线程等。
我们将使用Python的内置库`http.server`来创建一个简单的Web服务器。虽然这个示例相对简单,但我们可以围绕它展开许多讨论,包括HTTP协议、网络编程、异常处理、多线程等。
|
17天前
|
Java 数据格式
Java面试题:简述Java Socket编程的基本流程,包括客户端和服务器的创建与通信。
Java面试题:简述Java Socket编程的基本流程,包括客户端和服务器的创建与通信。
18 0
|
24天前
|
网络协议 网络安全
使用NetAssist网络调试助手在单台计算机上配置TCP服务器和客户端
使用NetAssist网络调试助手在单台计算机上配置TCP服务器和客户端
56 0
|
27天前
|
消息中间件 Serverless 网络性能优化
消息队列 MQ产品使用合集之客户端和服务器之间的保活心跳检测间隔是怎么设置的
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
1月前
|
前端开发 API 开发工具
视觉智能开放平台产品使用合集之人脸识别客户端如何直接访问服务器进行人脸识别并传递视频流
视觉智能开放平台是指提供一系列基于视觉识别技术的API和服务的平台,这些服务通常包括图像识别、人脸识别、物体检测、文字识别、场景理解等。企业或开发者可以通过调用这些API,快速将视觉智能功能集成到自己的应用或服务中,而无需从零开始研发相关算法和技术。以下是一些常见的视觉智能开放平台产品及其应用场景的概览。
|
22天前
|
网络协议
Qt中的网络编程(Tcp和Udp)运用详解以及简单示范案例
Tcp和Udp是我们学习网络编程中经常接触到的两个通讯协议,在Qt也被Qt封装成了自己的库供我们调用,对于需要进行网络交互的项目中无疑是很重要的,希望这篇文章可以帮助到大家。 是关于Qt中TCP和UDP的基本使用和特点:
|
1月前
|
网络协议 JavaScript 安全
深入浅出TCP 与 UDP
深入浅出TCP 与 UDP
48 0