这里我们选择的是async/await的模式Rust中的async
跟数据通讯相关的代码均放在streams目录下面。
下面展示的是http代理,通过加密TLS中的转化flowchart TD A[TcpStream请求到代理]|建立连接/明文|B[代理转化成TransStream] B|转发到/内部|C[中心客户端] C|建立加密连接/加密|D[TlsStream< TcpStream>绑定中心服务端] D|收到Create/内部|E[虚拟出VirtualStream] E|解析到host并连接/明文|F[TcpStream连接到http服务器]上述过程实现了程序中实现了http的代理转发
以下是http内网穿透在代理中的转化flowchart TD A[服务端绑定http对外端口]|接收连接/明文|B[外部的TcpStream] B|转发到/内部|C[中心服务端并绑定TransStream] C|通过客户的加密连接推送/加密|D[TlsStream< TcpStream>绑定中心客户端] D|收到Create/内部|E[虚拟出VirtualStream] E|解析对应的连接信息/明文|F[TcpStream连接到内网的http服务器]上述过程可以主动把公网的请求连接转发到内网,由内网提供完服务后再转发到公网的请求,从而实现内网穿透。
下面是代码类的定义
主要的逻辑流程,循环监听数据流的到达,同时等待多个异步的到达,这里用的是tokio::select!宏
下面是代码类的定义
主要的逻辑流程,循环监听数据流的到达,同时等待多个异步的到达,这里用的是tokio::select!宏,select处理方法与Client相同,均处理相同逻辑,不同的是接收数据包后数据端是处理的proxy的请求,而Client处理的是内网穿透的逻辑
下面是代码类的定义
主要的逻辑流程,循环监听数据流的到达,同时等待多个异步的到达,这里用的是tokio::select!宏,监听的对象有stream可读,可写,sender的写发送及receiver的可接收
下面是代码类的定义,我们并未有真实的socket,通过虚拟出的端方便后续的操作
虚拟的流主要通过实现AsyncRead及AsyncWrite[code]impl AsyncRead for VirtualStream{ // 有读取出数据,则返回数据,返回数据0的Ready状态则表示已关闭 fn poll_read( mut self: std::pin:
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) | Powered by Discuz! X3.4 |