开源WindivertDotnet( 二 )

outbound and !loopback and (tcp.DstPort == 80 or udp.DstPort == 53),这种filter的作用,想必使用过wireshark软件的都特别明白 。
不足的是,人们在做dotnet封装时,仅仅做了Invoke(string filter)这种传话筒式的封装 , 好家伙,filter language一共100个字段左右 , 我保证使用者不翻看filter language宝典的话,肯定不知道怎么构造这个string内容 , 您好歹从语法层面超越一下,提供一下filter的Builder也好啊 。
WindivertDotnet提供Filter类型使用Lambda来构造这个filter language,有了它您不再需要珍藏filter language葵花宝典了,就像使用了EF之后不会sql又何妨呢,因为如下的csharp代码,每个人都打得出:
var filter = Filter.True.And(f => f.Network.Outbound && !f.Network.Loopback).And(f => f.Tcp.DstPort == 80 || f.Udp.DstPort == 53);2.5 异步IO封装没有async和await的IO,那不是完美的IO,WinDivert提供了可选的LPOVERLAPPED,让上层可以使用IOCP模型,遗憾的是目前没有任何封装项目应用了这个参数 , 并结合IOCP模型包装为dotnet的Task或ValueTask异步模型 。他们都是直接PInvoke使用了SendRecv这两个api,或者是SendEx之后又同步阻塞等待LPOVERLAPPED的完成,这种和dotnet里的 Task.Wait() 其实是一个道理,调用工作线程在IO完成之前只能干等,而没法抽身回到线程池中 。
WindivertDotnet将LPOVERLAPPED与IOCP模型结束,并封装为dotnet的TAP异步模型 , 凝结出下面两个核心方法:
ValueTask<int> RecvAsync(WinDivertPacket, WinDivertAddress, CancellationToken);ValueTask<int> SendAsync(WinDivertPacket, WinDivertAddress, CancellationToken);Api方法是简单,但过程曲折 , 没有资料,碰壁无数,哪怕是小小的CancellationToken参数 , 但它却能让pendding的IO操作撤销下来 。
3 后话因FastGithub项目的需要,所以本项目才得以诞生 , 现在我是结合实际项目的中使用痛点来改进本项目,甚至添加了一些WinDivert目前没有的功能,相信本项目越来越好用 。
【开源WindivertDotnet】

推荐阅读