public TransmittedTcpPacketEventArgs( TcpConnectionId connectionId, TransmissionDirection direction, bool synchronize, bool acknowledgment, bool reset, bool finished, uint sequenceNumber, uint acknowledgmentNumber, byte[] data) { _text = null; TimeStampKey = new TimeStampKey(); ConnectionId = connectionId; Direction = direction; Synchronize = synchronize; Acknowledgment = acknowledgment; Reset = reset; Finished = finished; SequenceNumber = sequenceNumber; AcknowledgmentNumber = acknowledgmentNumber; Data = new byte[data.Length]; Array.Copy(data, Data, Data.Length); }
static void Main(string[] args) { #if false var sockets = NetworkInterface.GetAllNetworkInterfaces() .Where(nic => nic.OperationalStatus == OperationalStatus.Up && nic.NetworkInterfaceType != NetworkInterfaceType.Loopback && nic.NetworkInterfaceType != NetworkInterfaceType.Tunnel) .Select(nic => nic.GetIPProperties()) .Where(props => props != null) .SelectMany(props => props.UnicastAddresses) .Select(unicastAddress => { switch (unicastAddress.Address.AddressFamily) { case AddressFamily.InterNetwork: return(CreateIPV4RawSocket(unicastAddress.Address)); case AddressFamily.InterNetworkV6: return(CreateIPV6RawSocket(unicastAddress.Address)); default: return(null); } }) .Where(socket => socket != null) .ToList(); foreach (var socket in sockets) { ReceivePacket(socket); } Console.ReadLine(); #else var targetIPAddresses = new[] { IPAddress.Parse("124.150.157.49") }; foreach (var device in CaptureDeviceList.Instance) { try { IDictionary <IPAddress, object> intefaceAddresses; bool isLoopbackDevice; if (device is LibPcapLiveDevice) { var p = (LibPcapLiveDevice)device; isLoopbackDevice = p.Loopback; intefaceAddresses = p.Addresses.Where(address => address.Addr.ipAddress != null).ToDictionary(address => address.Addr.ipAddress, address => (object)null); } else if (device is NpcapDevice) { var p = (NpcapDevice)device; isLoopbackDevice = p.Loopback; intefaceAddresses = p.Addresses.Where(address => address.Addr.ipAddress != null).ToDictionary(address => address.Addr.ipAddress, address => (object)null); } else { throw new Exception(); } if (!isLoopbackDevice) { device.OnPacketArrival += (s, e) => { var packet = Packet.ParsePacket(e.Packet.LinkLayerType, e.Packet.Data); if (packet != null) { var ipPacket = packet.Extract <IPPacket>(); if (ipPacket != null) { var sourceIPAddress = ipPacket.SourceAddress; var destinationIPAddress = ipPacket.DestinationAddress; TransmissionDirection direction; if (intefaceAddresses.ContainsKey(sourceIPAddress)) { if (intefaceAddresses.ContainsKey(destinationIPAddress)) { direction = TransmissionDirection.None; } else { direction = TransmissionDirection.Send; } } else { if (intefaceAddresses.ContainsKey(destinationIPAddress)) { direction = TransmissionDirection.Recv; } else { direction = TransmissionDirection.None; } } if (direction != TransmissionDirection.None) { var tcpPacket = packet.Extract <TcpPacket>(); if (tcpPacket != null) { var sourceEndPoint = new IPEndPoint(sourceIPAddress, tcpPacket.SourcePort); var destinationEndPoint = new IPEndPoint(destinationIPAddress, tcpPacket.DestinationPort); var connectionId = new TcpConnectionId(direction, sourceIPAddress, destinationIPAddress, tcpPacket.SourcePort, tcpPacket.DestinationPort); var arg = new TransmittedTcpPacketEventArgs( connectionId, direction, tcpPacket.Synchronize, tcpPacket.Acknowledgment, tcpPacket.Reset, tcpPacket.Finished, tcpPacket.SequenceNumber, tcpPacket.AcknowledgmentNumber, tcpPacket.PayloadData); System.Diagnostics.Debug.WriteLine(arg.ToString()); } } } } }; device.Open(DeviceMode.Promiscuous); var addressFilters = targetIPAddresses .Select(address => string.Format("ip host {0}", address)) .ToList(); string filter; switch (addressFilters.Count) { case 0: filter = "(ip || ip6) && tcp"; break; case 1: filter = string.Format( "(ip || ip6) && tcp && {0}", string.Join(" || ", addressFilters.First())); break; default: filter = string.Format( "(ip || ip6) && tcp && ({0})", string.Join(" || ", addressFilters)); break; } device.Filter = filter; device.StartCapture(); } } catch (Exception) { // NOP } } Console.ReadLine(); #endif }