1

我将使用 Pcap.Net 0.10.0 (67076) 发送 TCP 或 HTTP 数据包但不起作用,只能使用 UDP 数据包?我可以看到 TCPViewer 中显示 UDP 数据包,但现在显示 TCP 或 HTTP 数据包。

我使用的是 Windows 7 64 位,但我确实构建了应用程序 x86 平台。

这是我的代码。

using System;
using System.Collections.Generic;
using System.Linq;
using PcapDotNet.Base;
using PcapDotNet.Core;
using PcapDotNet.Packets;
using PcapDotNet.Packets.Arp;
using PcapDotNet.Packets.Dns;
using PcapDotNet.Packets.Ethernet;
using PcapDotNet.Packets.Gre;
using PcapDotNet.Packets.Http;
using PcapDotNet.Packets.Icmp;
using PcapDotNet.Packets.Igmp;
using PcapDotNet.Packets.IpV4;
using PcapDotNet.Packets.Transport;
using System.Text;

namespace PcapTest
{
class Program
{
    static void Main(string[] args)
    {
        // Retrieve the device list from the local machine
        IList<LivePacketDevice> allDevices = LivePacketDevice.AllLocalMachine;

        if (allDevices.Count == 0)
        {
            Console.WriteLine("No interfaces found! Make sure WinPcap is installed.");
            return;
        }

        // Print the list
        for (int i = 0; i != allDevices.Count; ++i)
        {
            LivePacketDevice device = allDevices[i];
            Console.Write(String.Format("{0}. {1}", (i + 1), device.Name));
            Console.WriteLine(device.Description != null ? String.Format(" ({0})", device.Description) : " (No description available)");
        }

        int deviceIndex = 0;
        do
        {
            Console.WriteLine(String.Format("Enter the interface number (1-{0}):", allDevices.Count));
            string deviceIndexString = Console.ReadLine();
            if (!int.TryParse(deviceIndexString, out deviceIndex) ||
                deviceIndex < 1 || deviceIndex > allDevices.Count)
            {
                deviceIndex = 0;
            }
        } while (deviceIndex == 0);

        // Take the selected adapter
        PacketDevice selectedDevice = allDevices[deviceIndex - 1];

        // Open the output device
        using (PacketCommunicator communicator = selectedDevice.Open(69559, PacketDeviceOpenAttributes.Promiscuous, 1000)) // read timeout
        {
            communicator.SendPacket(BuildHttpPacket());
        }
        Console.ReadKey();
    }

    private static Packet BuildHttpPacket()
    {
        EthernetLayer ethernetLayer =
            new EthernetLayer
            {
                Source = new MacAddress("01:01:01:01:01:01"),
                Destination = new MacAddress("02:02:02:02:02:02"),
                EtherType = EthernetType.None, // Will be filled automatically.
            };

        IpV4Layer ipV4Layer =
            new IpV4Layer
            {
                Source = new IpV4Address("99.99.99.99"),
                CurrentDestination = new IpV4Address("111.90.147.168"),
                Fragmentation = IpV4Fragmentation.None,
                HeaderChecksum = null, // Will be filled automatically.
                Identification = 123,
                Options = IpV4Options.None,
                Protocol = null, // Will be filled automatically.
                Ttl = 100,
                TypeOfService = 0,
            };

        TcpLayer tcpLayer =
            new TcpLayer
            {
                SourcePort = 4050,
                DestinationPort = 80,
                Checksum = null, // Will be filled automatically.
                SequenceNumber = 100,
                AcknowledgmentNumber = 50,
                ControlBits = TcpControlBits.Acknowledgment,
                Window = 100,
                UrgentPointer = 0,
                Options = TcpOptions.None,
            };

        HttpRequestLayer httpLayer =
            new HttpRequestLayer
            {
                Version = HttpVersion.Version11,
                Header = new HttpHeader(new HttpContentLengthField(11)),
                Body = new Datagram(Encoding.ASCII.GetBytes("hello world")),
                Method = new HttpRequestMethod(HttpRequestKnownMethod.Get),
                Uri = @"http://pcapdot.net/",
            };

        PacketBuilder builder = new PacketBuilder(ethernetLayer, ipV4Layer, tcpLayer, httpLayer);

        return builder.Build(DateTime.Now);
    }
}
}
4

1 回答 1

1

如果你想在服务器中看到请求,你应该创建一个有效的 TCP 连接。这包括 TCP 3 次握手 (SYN,SYN-ACK,ACK)。

如果您只是发送一个 HTTP 请求,服务器将忽略它,因为它忽略了超出有效 TCP 连接的数据包。

在http://en.wikipedia.org/wiki/Transmission_Control_Protocol中查看更多信息

于 2012-11-23T19:12:30.687 回答