内网穿透工具的原理与开发实战
首先通过判断传入参数决定当前使用何种转发策略。 然后再判断传入参数是否正确,通过正则表达式等方式验证IP的合法性以及端口范围。 通过port2port函数实现了两个端口同时监听双向并且转发数据。 在port2host操作中实现了跳板中转。 在host2host中实现了主动连接打通隧道的功能。 看代码便可以知道,在Golang中进行socket操作的net包要比C语言中的socket.h操作简单很多。 转发功能的核心就在于forward函数部分。 先输出一个日志说明是对哪两个连接进行双向转发,然后通过sync包下的WaitGroup实现一个条件阻塞功能,防止在Goroutine还未执行完,主线程就已经退出了。 然后发射两个Goroutine,分别处理连接1到连接2的IO数据包拷贝以及连接2到连接1的IO数据包拷贝。因为要保证两个端口间的通信是全双工的,也就是两边同时都要能够互相交换数据,所以要用Goroutine来实现这两个操作的并发。 而IO数据包的拷贝核心代码在connCopy函数中,根据是否要记录流量日志判断是否要使用io.MultiWriter这个多路写数据流的函数。 如果打开日志文件的文件流成功,则通过io.MultiWriter函数生成一个多路写入流,这里这个多路写入流的变量名为w,任何写入到w这个写入流的数据都会同时写入先前参与执行多路写入流创建函数io.MultiWriter的参数中,在这里参数为conn1和logFile,即为端口1和日志文件流。 接着调用io.Copy将第二参数的读取流中读取到的数据源源不断地拷贝到第一个参数的写入流中。 (编辑:西安站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |