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使用了Send
和Recv
这两个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】
推荐阅读
- 1 个人数据保全计划: NAS开箱
- 我用canvas带你看一场流星雨
- mongodb基础整理篇————副本概念篇[外篇]
- 如何使用 pyqt 读取串口传输的图像
- 如何编写 Pipeline 脚本
- Java学习之路:流程控制
- MasaFramework -- 异常处理
- 二 kafka详解--kafka为什么快
- 使用开源计算引擎提升Excel格式文件处理效率
- Golang可能会踩的58个坑之初级篇