public void Write(IDataChunk chunk, byte[] data) { const int microseconds = 1_000_000; if (chunk is Packet packet) { foreach (var raw in _encoder.BuildPacket(packet)) { if (disposed) { break; } var unixUs = packet.Timestamp.UtcDateTime.GetUnixMicroSeconds(); if (unixUs <= lastMicroseconds) { unixUs = lastMicroseconds + 1; // every packet should have unique timestamp and increment sequentially } _pcap.WritePacket(new PcapPacket(unixUs / microseconds, unixUs % microseconds, raw)); lastMicroseconds = unixUs; } } }
/// <summary> /// 捕捉事件 /// </summary> /// <param name="sender"></param> /// <param name="args"></param> private void OnCapture(Object sender, PacketArrivedEventArgs args) { //Console.Clear(); //Length = Length + args.PacketLength; //args.Protocol可以是TCP:/UDP:/ICMP:/IGMP:/UNKNOWN if (args.Protocol != Setting.Instance.Protocal.ToString()) { return; } if (this.capturedIp.ToString() != args.DestinationAddress || args.DestinationPort != Setting.Instance.CapturedPort) { return; } Console.WriteLine(" 目标IP:" + args.DestinationAddress + "\t目标端口:" + args.DestinationPort + "\t协议版本:" + args.IPVersion + "\t源地址:" + args.OriginationAddress + "\t源端口:" + args.OriginationPort + "\tIP包长度:" + args.PacketLength + "\t协议类型:" + args.Protocol); Console.WriteLine(" Data: " + BitConverter.ToString(args.ReceiveBuffer, 16)); Task.Run(() => { DateTime timeCreated = DateTime.Now; UInt32 ts_sec = (UInt32)((timeCreated.Subtract(new DateTime(1970, 1, 1))).TotalSeconds); UInt32 ts_usec = (UInt32)(((timeCreated.Subtract(new DateTime(1970, 1, 1))).TotalMilliseconds) - ((UInt32)((timeCreated.Subtract(new DateTime(1970, 1, 1))).TotalSeconds * 1000))) * 1000; UInt32 incl_len = (UInt32)args.PacketLength; PcapPacket packet = new PcapPacket(ts_sec, ts_usec, args.ReceiveBuffer, args.PacketLength); writer.WritePacket(packet); }); }