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

简介: 客户端示例:     [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搭建和管理企业级网站应用
目录
相关文章
|
10天前
|
网络协议 开发者 Python
Socket如何实现客户端和服务器间的通信
通过上述示例,展示了如何使用Python的Socket模块实现基本的客户端和服务器间的通信。Socket提供了一种简单且强大的方式来建立和管理网络连接,适用于各种网络编程应用。理解和掌握Socket编程,可以帮助开发者构建高效、稳定的网络应用程序。
45 10
|
2月前
|
存储 开发工具 git
[Git] 深入理解 Git 的客户端与服务器角色
Git 的核心设计理念是分布式,每个仓库既可以是客户端也可以是服务器。通过 GitHub 远程仓库和本地仓库的协作,Git 实现了高效的版本管理和代码协作。GitHub 作为远程裸仓库,存储项目的完整版本历史并支持多客户端协作;本地仓库则通过 `.git` 文件夹独立管理版本历史,可在离线状态下进行提交、回滚等操作,并通过 `git pull` 和 `git push` 与远程仓库同步。这种分布式特性使得 Git 在代码协作中具备强大的灵活性和可靠性。
76 18
[Git] 深入理解 Git 的客户端与服务器角色
|
3月前
|
存储 人工智能 自然语言处理
ChatMCP:基于 MCP 协议开发的 AI 聊天客户端,支持多语言和自动化安装 MCP 服务器
ChatMCP 是一款基于模型上下文协议(MCP)的 AI 聊天客户端,支持多语言和自动化安装。它能够与多种大型语言模型(LLM)如 OpenAI、Claude 和 OLLama 等进行交互,具备自动化安装 MCP 服务器、SSE 传输支持、自动选择服务器、聊天记录管理等功能。
861 15
ChatMCP:基于 MCP 协议开发的 AI 聊天客户端,支持多语言和自动化安装 MCP 服务器
|
3月前
|
网络协议 Java API
【JavaEE】——Udp翻译器的实现(回显服务器)
网络编程,DatagramSocket 和 DatagramPacket类,回显服务器,服务器实现,客户端实现,
|
4月前
|
开发框架 .NET C#
在 ASP.NET Core 中创建 gRPC 客户端和服务器
本文介绍了如何使用 gRPC 框架搭建一个简单的“Hello World”示例。首先创建了一个名为 GrpcDemo 的解决方案,其中包含一个 gRPC 服务端项目 GrpcServer 和一个客户端项目 GrpcClient。服务端通过定义 `greeter.proto` 文件中的服务和消息类型,实现了一个简单的问候服务 `GreeterService`。客户端则通过 gRPC 客户端库连接到服务端并调用其 `SayHello` 方法,展示了 gRPC 在 C# 中的基本使用方法。
85 5
在 ASP.NET Core 中创建 gRPC 客户端和服务器
|
3月前
|
安全 编译器 Linux
深入解析与防范:基于缓冲区溢出的FTP服务器攻击及调用计算器示例
本文深入解析了利用缓冲区溢出漏洞对FTP服务器进行远程攻击的技术,通过分析FreeFlow FTP 1.75版本的漏洞,展示了如何通过构造过长的用户名触发缓冲区溢出并调用计算器(`calc.exe`)。文章详细介绍了攻击原理、关键代码组件及其实现步骤,并提出了有效的防范措施,如输入验证、编译器保护和安全编程语言的选择,以保障系统的安全性。环境搭建基于Windows XP SP3和Kali Linux,使用Metasploit Framework进行攻击演示。请注意,此内容仅用于教育和研究目的。
117 4
|
4月前
|
弹性计算 开发工具 git
2分钟在阿里云ECS控制台部署个人应用(图文示例)
作为一名程序员,我在部署托管于Github/Gitee的代码到阿里云ECS服务器时,经常遇到繁琐的手动配置问题。近期,阿里云ECS控制台推出了一键构建部署功能,简化了这一过程,支持Gitee和GitHub仓库,自动处理git、docker等安装配置,无需手动登录服务器执行命令,大大提升了部署效率。本文将详细介绍该功能的使用方法和适用场景。
2分钟在阿里云ECS控制台部署个人应用(图文示例)
|
5月前
|
网络协议 Unix Linux
一个.NET开源、快速、低延迟的异步套接字服务器和客户端库
一个.NET开源、快速、低延迟的异步套接字服务器和客户端库
137 4
|
5月前
|
安全 区块链 数据库
|
3月前
|
监控 网络协议 网络性能优化
不再困惑!一文搞懂TCP与UDP的所有区别
本文介绍网络基础中TCP与UDP的区别及其应用场景。TCP是面向连接、可靠传输的协议,适用于HTTP、FTP等需要保证数据完整性的场景;UDP是无连接、不可靠但速度快的协议,适合DNS、RIP等对实时性要求高的应用。文章通过对比两者在连接方式、可靠性、速度、流量控制和数据包大小等方面的差异,帮助读者理解其各自特点与适用场景。

热门文章

最新文章