コード例 #1
0
 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);
 }
コード例 #2
0
        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
        }