ZerotTier -- 开源、不限流、实现远程连接的内网穿透工具(window环境)

1. 需求描述

        下班时候,由于紧急情况需要远程连接公司电脑进行办公。但公司与家里不在同个局域网,不能直接用微软远程桌面连接。

        这时就会想到远程控制软件TeamViewer和向日葵。但TeamViewer免费版有商业使用限制,而且它服务器在国外,国内用户使用有延迟;向日葵虽然无需额外配置,但免费版强制走国内/国际中转服务器,带宽限制(约300Kbps-2Mbps)​,操作易卡顿。虽然付费能解决,但是成本变高了。

        本人想要一款开源的、使用免费且不限流,安全性高,适合长期稳定使用,免费版支持10台左右的设备连接。ZerotTier刚好满足个人要求,它基于P2P和官方中继服务器自动穿透内网,无需自建服务器,免费版支持50台设备(远超10台需求)。

注意:ZeroTier本身的服务器都在国外访问速度很慢,可以通过搭建国内Moon服务加速解决连接慢的问题。

2. 部署流程

1)下载window版本的ZeroTier安装包

官网地址:https://www.zerotier.com/download

​​

2)按提示安装

​​

​​

​​

注意:

 在安装时如果遇到下面的问题,则按教程解决:

安装第三方软件报错:Called RunScript when not marked in progress-CSDN博客2)在属性弹框中,点击【编辑】,然后在权限弹框中点击【添加】,在选择用户或组弹框中输入自定义的对象名称 “everyone”,点击【检查名称】,再点击【确认】,即可添加everyone账户。3. 在权限弹框中选择everyone账户,并勾选下方的所有权限,点击多次【确定】关闭所有弹框,账户即可生效。1)进入到 C:\Windows 下,找到temp文件,鼠标右键,点击属性。4. 重新找到第三方软件进行安装,即可正常安装。 https://blog.csdn.net/qq_39512532/article/details/145971561

3)配置

(1)在zerotier官网注册一个账号,创建一个网络,然后复制NETWORK ID。

​​

(2)安装好ZeroTier软件后,找到电脑右下角小图标,右键,点击【Join New Network】,在弹框中黏贴刚刚复制的NETWORK ID,点击Join按钮。

​​

​​

(3)点击NETWORK ID进入一个新页面

​​

(4)在新页面中,可看到刚配置完机子,此时只会看到一行,勾选前面的多选框,点击【Auth】按钮,后面的Managed IPs就是在虚拟局域网中你这台机子的ip。

​​

5)其他想连接的机子,也需要先下载、安装与配置一下zerotier,方法一样,最后同样加入到虚拟局域网中,勾选Auth,后面的ip记录下来。

4、使用

直接打开微软的远程桌面连接,输入需要远程的那台机子的Manged IPs的ip地址,输入该台电脑的账号密码,就可以连接上了。

<think>嗯,用户想用C语言写一个远程桌面程序,还要支持内网穿透。这个任务看起来挺复杂的,过让我先理清楚步骤。首先,远程桌面程序通常包括几个部分:捕获屏幕、压缩图像、网络传输,以及控制指令的发送和接收。再加上内网穿透的话,可能需要用到反向代理或者STUN/TURN服务器之类的技术。 用户可能有一定的C语言基础,但对网络编程和图形处理可能太熟悉。需要先考虑跨平台的问题吗?比如用户是在Windows还是Linux下开发?同的系统屏幕捕获方法同,比如Windows可能有GDI或DirectX,而Linux可能用Xlib或framebuffer。过用户没有明确说明,可能需要先假设跨平台或者选择一个平台作为例子。 然后是图像压缩,可能需要用到像libjpeg或者libpng这样的库来处理压缩,或者使用视频编码库如H.264来减少传输数据量。过使用这些库会增加复杂性,特别是对于C语言来说,需要处理内存管理和库的集成。用户可能需要简化这部分,比如先使用简单的无损压缩,再逐步优化。 网络传输部分,需要选择TCP还是UDP。TCP可靠但可能有延迟,UDP快速但可靠。远程桌面通常对实时性要求高,可能UDP更适合,但需要考虑丢包和乱序的问题。或者使用像WebRTC这样的框架,但C语言中可能没有现成的库,需要自己实现或者找开源项目。 内网穿透方面,用户可能没有公网IP,所以需要打洞或者使用中继服务器。NAT穿透通常涉及STUN服务器获取公网地址,或者使用反向代理,比如frp或者ngrok。这部分需要另一个服务器作为中转,或者用户自己搭建。如果用户希望程序自带内网穿透,可能需要集成类似的功能,比如实现P2P打洞,或者连接到一个中继服务器。 安全性也是需要考虑的,比如数据传输是否需要加密,使用SSL/TLS。过增加加密可能会影响性能,特别是对于实时画面传输来说。用户可能希望先实现基本功能,再逐步添加安全措施。 另外,控制指令的传输,比如鼠标和键盘事件,需要从客户端发送到服务端,并模拟输入。这部分在同系统上有同的API,比如Linux的uinput,Windows的SendInput。 现在,用户可能希望有一个大致的步骤和需要用到的库或技术。可能需要分模块讲解:屏幕捕获、输入处理、图像处理、网络传输、内网穿透。每个部分用C语言实现的方法,以及可能遇到的坑。 比如,屏幕捕获在Linux下可以用XGetImage,然后转换为RGB数据。压缩可以用libjpeg压缩成JPEG,然后通过socket发送。客户端接收后解压显示。内网穿透可能需要客户端和服务端都连接到一个公网服务器进行中转,或者使用UPnP自动端口映射。 过,内网穿透的具体实现比较复杂,可能需要借助现有的工具,比如集成frpc到程序中,或者自己实现NAT打洞的逻辑。这部分在C语言中需要处理UDP打洞的步骤,比如发送STUN请求获取外网地址,然后交换地址信息,建立P2P连接。 可能用户没有考虑到这些复杂性,所以需要分步骤指导,先从简单的局域网远程桌面开始,然后再逐步添加内网穿透功能。或者推荐结合现有工具,比如先完成远程桌面的基本功能,内网穿透使用现成的工具如frp,这样更实际。 总结下来,步骤可能包括: 1. 实现屏幕捕获模块,获取屏幕图像。 2. 图像压缩处理,减少传输数据量。 3. 网络通信模块,传输图像和输入事件。 4. 处理客户端输入(鼠标、键盘)并发送到服务端。 5. 内网穿透实现,可能需要第三方库或服务器。 在C语言中,可能需要用到socket编程、多线程/多进程处理、图形库(如libX11、GDI)、压缩库(libjpeg)、以及可能的加密库(OpenSSL)。对于内网穿透,可能需要了解STUN协议,或者使用现有中继服务。 用户可能需要更具体的代码示例,比如如何捕获屏幕,如何发送数据包。但完整的远程桌面程序代码量很大,无法在此详细展开,但可以给出框架和关键部分的示例。 同时,需要考虑性能优化,比如差异帧传输(只发送变化的屏幕区域),降低分辨率,调整帧率等。 最后,可能还需要提醒用户,这样的项目复杂度高,建议分阶段实现,并参考现有开源项目,比如rdesktop、TigerVNC等,了解其实现原理。</think>使用C语言编写一个支持内网穿透远程桌面程序需要结合多个领域的知识(网络编程、图形处理、NAT穿透等)。以下是实现的核心模块和关键步骤: -- ### **一、核心功能模块** 1. **屏幕捕获** - **Windows**:使用 `GDI` 或 `DirectX` 捕获屏幕(如 `BitBlt` 函数)。 - **Linux**:通过 `Xlib`(X11)或 `libav`(视频帧抓取)获取屏幕数据。 2. **输入控制** - 监听客户端鼠标/键盘事件,通过系统API(如Windows的 `SendInput` 或Linux的 `uinput`)模拟操作。 3. **图像压缩** - 使用 `libjpeg`(静态压缩)或 `x264`(视频流编码)减少传输数据量。 4. **网络传输** - 基于 **TCP/UDP Socket** 传输数据,需处理分包、粘包和丢包问题。 5. **内网穿透** - 使用 **STUN协议** 或第三方工具(如 `frp`/`ngrok`)实现NAT穿透。 -- ### **二、内网穿透实现方案** #### **方案1:基于STUN/NAT穿透** 1. **STUN服务器**:客户端通过STUN服务器获取公网IP和端口。 2. **UDP打洞**:双方交换地址信息后直接建立P2P连接。 ```c // 伪代码示例:向STUN服务器发送请求 sendto(stun_socket, "QUERY", 5, stun_server_ip, 12345); recvfrom(...); // 解析返回的公网IP和端口 ``` #### **方案2:反向代理中转** 1. **公网服务器中转**:通过自有服务器或 `frp` 转发流量。 ```bash # 使用frp配置示例(非C代码) frps.ini: [common] bind_port = 7000 frpc.ini: [rdp] type = tcp local_port = 3389 remote_port = 6000 ``` -- ### **三、关键代码示例** #### 1. **屏幕捕获(Linux/X11)** ```c #include <X11/Xlib.h> Display* display = XOpenDisplay(NULL); Window root = DefaultRootWindow(display); XImage* img = XGetImage(display, root, 0, 0, width, height, AllPlanes, ZPixmap); // 将 img->data 转换为RGB格式并压缩 ``` #### 2. **网络传输(TCP Socket)** ```c // 服务端发送数据 int server_fd = socket(AF_INET, SOCK_STREAM, 0); bind(server_fd, (struct sockaddr*)&addr, sizeof(addr)); listen(server_fd, 5); int client_fd = accept(server_fd, NULL, NULL); send(client_fd, compressed_data, data_size, 0); // 客户端接收 int sock = socket(AF_INET, SOCK_STREAM, 0); connect(sock, (struct sockaddr*)&server_addr, sizeof(server_addr)); recv(sock, buffer, buffer_size, 0); ``` -- ### **四、优化与注意事项** 1. **性能优化** - **差异更新**:仅传输屏幕变化区域(通过对比前后帧)。 - **动态码率**:根据网络状况调整压缩质量。 2. **安全性** - 使用 `OpenSSL` 加密传输数据(如TLS)。 3. **跨平台兼容性** - 使用 `CMake` 管理多平台编译,分离平台相关代码。 --- ### **五、推荐学习资源** 1. **网络编程**:《UNIX网络编程》(Richard Stevens) 2. **图像处理**:`libjpeg` / `libavcodec` 官方文档 3. **开源参考**: - [rdesktop](https://github.com/rdesktop/rdesktop)远程桌面协议实现- [libvncserver](https://libvnc.github.io/)(VNC服务端库) --- ### **六、总结** 实现远程桌面程序需要分模块逐步开发: 1. 先实现局域网内的屏幕传输和控制。 2. 再集成内网穿透(推荐先用 `frp` 简化开发)。 3. 最后优化延迟和安全性。 建议结合现有开源库(如WebRTC的C实现)减少重复造轮子的工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值