C# 如何获取在给定时间内发送超过X个数据包的IP

C# 如何获取在给定时间内发送超过X个数据包的IP,c#,.net,datetime,winpcap,sharppcap,C#,.net,Datetime,Winpcap,Sharppcap,我有一个C#程序,可以检测任何给定以太网设备上传入的TCP/IP数据包。每个数据包都在以下结构中处理: struct Packet{ String sourceIp; DateTime arrivalDate; } 如果我有一个每个传入数据包的列表(列表),我如何在不到Y秒(比如1秒)的时间内获得超过X个数据包的IP 我不知道如何解决这个问题,任何帮助/提示都将不胜感激。使用Linq,它将是这样的: List<Packet> allPackets = ne

我有一个C#程序,可以检测任何给定以太网设备上传入的TCP/IP数据包。每个数据包都在以下结构中处理:

struct Packet{
   String sourceIp;
   DateTime arrivalDate;
}
如果我有一个每个传入数据包的列表(列表),我如何在不到Y秒(比如1秒)的时间内获得超过X个数据包的IP


我不知道如何解决这个问题,任何帮助/提示都将不胜感激。

使用Linq,它将是这样的:

  List<Packet> allPackets =
     new List<Packet>
        {
           new Packet {arrivalDate = DateTime.Parse("2000-01-01 0:00:00"), sourceIp = "a"},
           new Packet {arrivalDate = DateTime.Parse("2000-01-01 0:00:01"), sourceIp = "a"},
           new Packet {arrivalDate = DateTime.Parse("2000-01-01 0:00:01"), sourceIp = "a"},
           new Packet {arrivalDate = DateTime.Parse("2000-01-01 0:01:00"), sourceIp = "a"},
           new Packet {arrivalDate = DateTime.Parse("2000-01-01 0:00:00"), sourceIp = "b"},
           new Packet {arrivalDate = DateTime.Parse("2000-01-01 0:01:00"), sourceIp = "b"},
           new Packet {arrivalDate = DateTime.Parse("2000-01-01 0:02:00"), sourceIp = "b"},
           new Packet {arrivalDate = DateTime.Parse("2000-01-01 0:03:00"), sourceIp = "b"},
        };
  var xPackets = 2;
  var interval = TimeSpan.FromSeconds(15);

  // We group all the packets by ip, then within that, order the packets by date.
  var ips =
     allPackets
        .GroupBy(
           p => p.sourceIp,
           (ip, packets) => new
                                {
                                   ip,
                                   packets = packets.OrderBy(p => p.arrivalDate).ToList()
                                })
        .ToList();
  // Build a list of IPs with at least x packets in y interval.
  var rapidIps = new List<string>();
  foreach (var ipPacket in ips)
  {
     for (int i = 0, j = xPackets; j < ipPacket.packets.Count; i++, j++)
     {
        if (ipPacket.packets[i].arrivalDate + interval >= ipPacket.packets[j].arrivalDate)
        {
           rapidIps.Add((ipPacket.ip));
           break;
        }

     }
  }
列出所有数据包=
新名单
{
新数据包{arrivalDate=DateTime.Parse(“2000-01-01 0:00:00”),sourceIp=“a”},
新数据包{arrivalDate=DateTime.Parse(“2000-01-01 0:00:01”),sourceIp=“a”},
新数据包{arrivalDate=DateTime.Parse(“2000-01-01 0:00:01”),sourceIp=“a”},
新数据包{arrivalDate=DateTime.Parse(“2000-01-01 0:01:00”),sourceIp=“a”},
新数据包{arrivalDate=DateTime.Parse(“2000-01-01 0:00:00”),sourceIp=“b”},
新数据包{arrivalDate=DateTime.Parse(“2000-01-01 0:01:00”),sourceIp=“b”},
新数据包{arrivalDate=DateTime.Parse(“2000-01-01 0:02:00”),sourceIp=“b”},
新数据包{arrivalDate=DateTime.Parse(“2000-01-01 0:03:00”),sourceIp=“b”},
};
var-xPackets=2;
var间隔=从秒开始的时间跨度(15);
//我们根据ip对所有数据包进行分组,然后在其中按日期对数据包进行排序。
变量ips=
所有数据包
.群比(
p=>p.sourceIp,
(ip,数据包)=>新建
{
知识产权,
packets=packets.OrderBy(p=>p.arrivalDate).ToList()
})
.ToList();
//建立一个IP列表,在y间隔内至少包含x个数据包。
var rapidIps=新列表();
foreach(ips中的变量ipPacket)
{
对于(int i=0,j=xPackets;j=ipPacket.packets[j].arrivalDate)
{
rapidIps.Add((ipPacket.ip));
打破
}
}
}

最后,
rapidIps
包含
[a]

如果您已经有了列表,只需进行计数和筛选。问题出在哪里?@MahmoudAl Qudsi如果这么简单,请添加一个解决方案。不要仅仅因为它对你来说微不足道就认为它对每个人来说都微不足道。看看这个@jb我有问题,当问题显示出我甚至没有试图解释需要发生什么时。@MahmoudAl Qudsi我发布了我到现在为止所做的事情。相信我,我已经试过好几次来探讨这种情况。因为这个问题就像一个过滤器,可以防止拒绝服务,我认为你应该对代码中的大O进行评论。@Bach,好主意。linq表达式似乎是
O(n)
+foreach/for是O(n)。所以它是
O(n)
+
O(n)
=
O(n)