21. 从零用Rust编写正反向代理,tokio竟然这样对待socket!
wmproxywmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器,四层TCP/UDP转发,内网穿透,后续将实现websocket代理等,会将实现过程分享出来,感兴趣的可以一起造个轮子
项目地址
国内: https://gitee.com/tickbh/wmproxy
github: https://github.com/tickbh/wmproxy
有请主角上场
Socket是集万千宠爱为一身的王子,在操作系统的王国里,他负责对外的所有通讯,所以要想沟通邻国的公主必须经过他,所以大家对他都是万般友好。
这天一个Rust城市里的大臣tokio对他发起了邀请,邀请他来参观严谨的逻辑庄园。
tokio庄园
庄园中的各成员对即将到来的王子议论纷纷。
大管家mio说:“大家都想想等下怎么向socket王子介绍自己,好让他配合大家的工作。”
大管家mio是tokio的基石,一切和王国打交道的都交由他去打理,他是保证庄园高效运转的关键,此刻他准备好了欢迎宴会。
在宴会上,socket听说tokio庄园是这座城市异步运行的重要基石,就很好奇的让大伙介绍介绍下怎么工作的。
庄园主tokio就说:“我是依靠着大管家mio帮我负责处理底层的事,Waker来提醒我有新的事情,PollEvented来帮我管理事件的。下面先让mio来介绍下。”
管家mio说:“我负责收集庄园中的所有信息,他们告诉我他们要关心的什么比较,比如您的到来(可读),或者您有什么话想说(可写),我会负责和王国的底层进行沟通,我在这个国家用的是epoll,据说在遥远的另一个国家用的是iocp,如果有相应的需求,我将会通知Waker,由他去提醒庄主来及时的处理,这场宴会也是提前得到通知而进行准备的。”
通知Waker说:“我所做的事情就是微不足道,我的对接对象是PollEvented,当他关心读事件,我会向mio去发起poll_read请求,如果此时mio那边已经知道有新的消息了,那我就直接把他们读出来交给民众Poll::Ready,如果此时还没有新消息,那我会告诉管家,有新消息的时候通知我Poll::Pending,此时我就在这里等待,直到有新的消息到达我就通知给民众。当他关心写事件,我会向mio请求poll_write请求,后续的和收消息的一致。现在给你们展示下包装了一层我的Context和我能换醒的虚表。”
/// 这个在代码里就是经常看到,它就是我的一层浅封装啦。
pub struct Context<'a> {
waker: &'a Waker,
_marker: PhantomData<fn(&'a ()) -> &'a ()>,
}
/// 我通过他来控制回调,保证唤醒的时候能正确的通知
pub struct RawWakerVTable {
clone: unsafe fn(*const ()) -> RawWaker,
wake: unsafe fn(*const ()),
wake_by_ref: unsafe fn(*const ()),
drop: unsafe fn(*const ()),
} 事件PollEvented说:“庄主要处理的事情太多了,而有些事情又需要等待一层层的反馈,他没法把精力放在一件事情上一直等待,所以就有了我出马,庄主告诉我他关心什么事,我就把它记下来,这样子庄主就可以去处理其它的事,等事件到来的时候我就告诉庄主,这样子庄主就可以高效的处理所有的事件。”
王子觉得他们说了一堆有点啰嗦
“带我看看你们实际的工坊,我要实地考查下。”王子说。
庄主就带着王子来到了,受理工坊,受理工坊正在处理建立受理点:
TcpListener::bind(addr).await受理点的内容就是PollEvent:
pub struct TcpListener {
io: PollEvented<mio::net::TcpListener>,
}当他接受新的受理者的时候:
pub async fn accept(&self) -> io::Result<(TcpStream, SocketAddr)> {
let (mio, addr) = self
.io
.registration()
.async_io(Interest::READABLE, || self.io.accept())
.await?;
let stream = TcpStream::new(mio)?;
Ok((stream, addr))
}他向PollEvent注册了可读事情有的时候通知他,此时PollEvent就建立了一个Waker对象,当有符合条件的时候就来告诉他:
/// 建立一个可读的Future对象fn readiness_fut(&self, interest: Interest) -> Readiness
页:
[1]