网络会话和发送文件

时间:2011-05-15 08:04:54

标签: c# networking

背景

您好。
我编写了一个程序来分析包含在其中的特定单词的数据包。我需要分析外发电子邮件,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,那么数据包将被阻止。

第二个问题:我如何确定这是电子邮件?

谢谢,对不起我的英语。

1 个答案:

答案 0 :(得分:0)

为了能够同时分析多个数据包/流,您需要重构您的解决方案以使用线程或其他形式的多任务处理,因为您的任务似乎是计算和io密集型的,您可能希望仔细研究如何利用操作系统级别的事件处理(select,epoll或目标平台的等效项)。

要回答关于电子邮件的第二个问题,您需要能够识别和跟踪用于从客户端向服务器传递电子邮件的tcp会话,假设会话尚未加密。

我相信您已经知道,您尝试解决的问题非常复杂,需要非常专业的技能,如实时编程,网络协议的深入了解等。

当然,有几种“深度包检测”解决方案已经为您完成所有这些(通常由上市公司用于满足Sarbanes-Oxley等监管要求),但它们非常昂贵。