首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

CPP在内网穿透技术的思考

编程知识
2024年09月13日 13:07

概述

内网穿透是一种技术,用于在私有局域网(LAN)中的设备与外部网络(如互联网)之间建立通信通道,使得外部设备可以访问内网中的服务。由于内网设备通常位于防火墙或 NAT(网络地址转换)设备之后,外部网络无法直接访问它们。因此,内网穿透技术旨在解决这一问题。本文将讨论如何使用 C++ 实现内网穿透技术,并介绍一些常见的实现方式。

一、内网穿透的基本原理

内网穿透的核心思想是通过一个中间服务器(通常位于公网中)来中转内网的请求。内网设备与外网设备通过这个中间服务器进行通信,避开防火墙或 NAT 设备的限制。具体流程包括以下步骤:

  1. 内网设备主动连接到中间服务器:由于 NAT 设备允许内部设备主动发起外部连接,因此内网设备可以与位于公网的中间服务器建立连接。
  2. 外网设备向中间服务器发出请求:外网设备通过公网 IP 地址访问中间服务器,请求访问内网中的服务。
  3. 中间服务器转发请求:中间服务器将外网设备的请求转发给已经连接的内网设备,内网设备响应后再通过中间服务器返回给外网设备。

二、常见的内网穿透技术实现手段

  1. 反向代理(Reverse Proxy) 反向代理是一种常见的内网穿透方式。使用反向代理时,内网设备主动与中间服务器建立连接,并保持连接的持续性。外网设备通过访问中间服务器获取内网服务。

    • 实现思路
      • 使用 C++ 开发的客户端程序在内网设备上运行,主动连接位于公网的中间服务器(该服务器可以使用 C++ 通过 socket 实现)。
      • 中间服务器充当代理,将外网的请求通过内网设备返回。
    • C++ 示例: 下面展示了一个简单的反向代理服务器的基本结构:
       
      #include <iostream>
      #include <boost/asio.hpp>
      
      using boost::asio::ip::tcp;
      
      void start_server(boost::asio::io_context& io_context, short port) {
          tcp::acceptor acceptor(io_context, tcp::endpoint(tcp::v4(), port));
          while (true) {
              tcp::socket socket(io_context);
              acceptor.accept(socket);
              std::string message = "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\nHello from the proxy!";
              boost::asio::write(socket, boost::asio::buffer(message));
          }
      }
      
      int main() {
          boost::asio::io_context io_context;
          start_server(io_context, 8080);
          return 0;
      }
      

        

  2. TCP 隧道(TCP Tunneling) TCP 隧道是一种通过中间服务器将外网请求直接转发到内网设备的方法。外网设备与内网设备之间的数据流通过中间服务器进行封装和转发,内网设备将其解封装后处理请求。

    • 实现思路

      • 使用 C++ 实现 TCP 隧道的功能,内网设备和外网设备同时与中间服务器保持连接。
      • 外网设备发送请求时,中间服务器将数据包转发给内网设备处理。
    • C++ 示例

       
      #include <iostream>
      #include <boost/asio.hpp>
      
      using boost::asio::ip::tcp;
      
      void start_server(boost::asio::io_context& io_context, short port) {
          tcp::acceptor acceptor(io_context, tcp::endpoint(tcp::v4(), port));
          while (true) {
              tcp::socket socket(io_context);
              acceptor.accept(socket);
              std::string message = "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\nHello from the proxy!";
              boost::asio::write(socket, boost::asio::buffer(message));
          }
      }
      
      int main() {
          boost::asio::io_context io_context;
          start_server(io_context, 8080);
          return 0;
      }
      

        

  3. UDP 打洞(UDP Hole Punching) UDP 打洞是一种广泛使用于 P2P 网络的技术。该技术通过让两个处于不同 NAT 后面的设备同时向一个中间服务器发送 UDP 数据包,从而建立起两者之间的直接通信。

    • 实现思路

      • 使用 C++ 开发内网设备的 UDP 客户端,同时向中间服务器和目标设备发送数据包。
      • 中间服务器在收到来自两个设备的请求后,向双方告知彼此的公网 IP 和端口号,进而双方可以通过该信息直接进行通信。
    • C++ 示例

       
      #include <iostream>
      #include <boost/asio.hpp>
      
      using boost::asio::ip::tcp;
      
      void tunnel_data(tcp::socket& in_socket, tcp::socket& out_socket) {
          char data[1024];
          boost::system::error_code error;
          size_t length = in_socket.read_some(boost::asio::buffer(data), error);
          if (!error) {
              boost::asio::write(out_socket, boost::asio::buffer(data, length));
          }
      }
      
      int main() {
          boost::asio::io_context io_context;
      
          // Connect to the external client
          tcp::acceptor acceptor(io_context, tcp::endpoint(tcp::v4(), 8888));
          tcp::socket client_socket(io_context);
          acceptor.accept(client_socket);
      
          // Connect to the internal server (i.e., device inside the LAN)
          tcp::resolver resolver(io_context);
          tcp::resolver::results_type endpoints = resolver.resolve("localhost", "80");
          tcp::socket server_socket(io_context);
          boost::asio::connect(server_socket, endpoints);
      
          // Start tunneling data between client and server
          tunnel_data(client_socket, server_socket);
      
          return 0;
      }
      

        

       

三、总结

内网穿透技术通过各种手段使得外部设备能够访问位于内网中的服务。通过反向代理、TCP 隧道和 UDP 打洞等技术,我们可以根据不同的网络环境和需求,选择最合适的内网穿透方案。C++ 提供了高效的网络编程支持,可以用来实现这些方案中的每一种。

From:https://www.cnblogs.com/thinkingmore/p/18412083
本文地址: http://shuzixingkong.net/article/1977
0评论
提交 加载更多评论
其他文章 WPF 实现一个吃豆豆的Loading加载动画
运行的效果如下 先引入一下我们需要的库 在nuget上面搜一下&quot;expression.Drawing&quot;,安装一下这个包 我们再创建一个Window,引入一下这个包的命名空间 我们设置一下这个加载动画呈现的窗体的样式 xmlns:ed=&quot;http://schemas.mi
WPF 实现一个吃豆豆的Loading加载动画 WPF 实现一个吃豆豆的Loading加载动画 WPF 实现一个吃豆豆的Loading加载动画
CPRFL:基于CLIP的新方案,破解长尾多标签分类难题 | ACM MM'24
现实世界的数据通常表现为长尾分布,常跨越多个类别。这种复杂性突显了内容理解的挑战,特别是在需要长尾多标签图像分类(LTMLC)的场景中。在这些情况下,不平衡的数据分布和多物体识别构成了重大障碍。为了解决这个问题,论文提出了一种新颖且有效的LTMLC方法,称为类别提示精炼特征学习(CPRFL)。该方法
CPRFL:基于CLIP的新方案,破解长尾多标签分类难题 | ACM MM'24 CPRFL:基于CLIP的新方案,破解长尾多标签分类难题 | ACM MM'24 CPRFL:基于CLIP的新方案,破解长尾多标签分类难题 | ACM MM'24
ArgoWorkflow教程(四)---Workflow & 日志归档
上一篇我们分析了argo-workflow 中的 artifact,包括 artifact-repository 配置以及 Workflow 中如何使用 artifact。本篇主要分析流水线 GC 以及归档,防止无限占用集群中 etcd 的空间。 1. 概述 因为 ArgoWorkflow 是用 C
ArgoWorkflow教程(四)---Workflow & 日志归档 ArgoWorkflow教程(四)---Workflow & 日志归档 ArgoWorkflow教程(四)---Workflow & 日志归档
C# 开源教程带你轻松掌握数据结构与算法
前言 在项目开发过程中,理解数据结构和算法如同掌握盖房子的秘诀。算法不仅能帮助我们编写高效、优质的代码,还能解决项目中遇到的各种难题。 给大家推荐一个支持C#的开源免费、新手友好的数据结构与算法入门教程:Hello算法。 项目介绍 《Hello Algo》是一本开源免费、新手友好的数据结构与算法入门
C# 开源教程带你轻松掌握数据结构与算法 C# 开源教程带你轻松掌握数据结构与算法 C# 开源教程带你轻松掌握数据结构与算法
《熬夜整理》保姆级系列教程-玩转Wireshark抓包神器教程(6)-Wireshark抓包界面详解
1.简介 在此之前,宏哥已经介绍和讲解过Wireshark的启动界面。但是很多初学者还会碰到一个难题,就是感觉wireshark抓包界面上也是同样的问题很多东西不懂怎么看。其实还是挺明了的宏哥今天就单独写一篇对其抓包界面进行详细地介绍和讲解一下。 2.Wireshak抓包界面概览 通过上一篇我们知道
《熬夜整理》保姆级系列教程-玩转Wireshark抓包神器教程(6)-Wireshark抓包界面详解 《熬夜整理》保姆级系列教程-玩转Wireshark抓包神器教程(6)-Wireshark抓包界面详解 《熬夜整理》保姆级系列教程-玩转Wireshark抓包神器教程(6)-Wireshark抓包界面详解
常回家看看之house_of_emma
house_of_emma 前言: 相比较于house_of_kiwi(house_of_kiwi),house_of_emma的手法更加***钻,而且威力更大,条件比较宽松,只需要lagebin_attack即可完成。 当然把两着放到一起是因为它们都利用了__malloc_assest来刷新IO流
常回家看看之house_of_emma 常回家看看之house_of_emma 常回家看看之house_of_emma
支付宝携手HarmonyOS SDK打造高效便捷的扫码支付体验
背景 在日常的购物转账、生活缴费等在线支付中,用户在正式拉起支付界面前,均需要至少经历一次&quot;识别&quot;+两次&quot;寻找&quot;,即识别归属应用、寻找应用、寻找扫码入口,才能完成扫码、付款,每一步都带来不同程度的用户流失。如何将步骤繁琐的扫码支付做到最简化,是优化在线支付体验
支付宝携手HarmonyOS SDK打造高效便捷的扫码支付体验 支付宝携手HarmonyOS SDK打造高效便捷的扫码支付体验 支付宝携手HarmonyOS SDK打造高效便捷的扫码支付体验
面试官:线程池遇到未处理的异常会崩溃吗?
首先,这个问题考察的是你对线程池 execute 方法和 submit 方法的理解,在 Java 线程池的使用中,我们可以通过 execute 方法或 submit 方法给线程池添加任务,但如果线程池中的程序在执行时,遇到了未处理的异常会怎么呢?接下来我们一起来看。 1.execute方法 exec
面试官:线程池遇到未处理的异常会崩溃吗? 面试官:线程池遇到未处理的异常会崩溃吗?