您好。
我编写了一个程序来分析包含在其中的特定单词的数据包。我需要分析外发电子邮件,jabber,ICQ。如果找到了这些单词,那么数据包就被阻止了。我做了,但我的文件有问题,并通过网络发送电子邮件。
简单代码:
while (Ndisapi.ReadPacket(hNdisapi, ref Request))
{
// some work
switch (protocol)
{
//....
case "HTTP":
// parse packet(byte[])
HTTP.HttpField field = HTTP.ParseHttp(ret);
if (field != null && field.Method == HTTP.HttpMethod.POST)
{
// analyze packet and drop if needed
DoWork();
}
}
问题如下。例如,我附上电子邮件500 KB的文件。该文件大约将拆分为340个数据包。在上面的代码中,仅执行第一个数据包的 DoWork()
好的,那么我需要完全恢复会话并将整个会话传递给 DoWork()。我做的。但是我不能等待会话结束,因为其他数据包(http,arp,所有数据包)将被暂停(并且几分钟后互联网断开连接)。
因此,第一个问题:
如何解决这个问题(可能是设计方案的建议)?
现在发送电子邮件,假设这段代码:
switch (protocol)
{
//....
case "HTTP":
// parse packet(byte[])
var httpMimeMessage = Mime.Parse(ret);
// analyze packet and drop if needed
DoSomeWork();
break;
}
例如,我们正在寻找“财务”这个词。然后,如果我们打开任何网站并且会有一个单词finance,那么数据包将被阻止。
第二个问题:我如何确定这是电子邮件?
谢谢,对不起我的英语。
答案 0 :(得分:0)
为了能够同时分析多个数据包/流,您需要重构您的解决方案以使用线程或其他形式的多任务处理,因为您的任务似乎是计算和io密集型的,您可能希望仔细研究如何利用操作系统级别的事件处理(select,epoll或目标平台的等效项)。
要回答关于电子邮件的第二个问题,您需要能够识别和跟踪用于从客户端向服务器传递电子邮件的tcp会话,假设会话尚未加密。
我相信您已经知道,您尝试解决的问题非常复杂,需要非常专业的技能,如实时编程,网络协议的深入了解等。
当然,有几种“深度包检测”解决方案已经为您完成所有这些(通常由上市公司用于满足Sarbanes-Oxley等监管要求),但它们非常昂贵。