0

我阅读了教程等,但我没有得到它。它确实允许您发送数据包,但是您如何告诉 Winpcap 将这些数据包发送到哪里呢?我应该在数据包上放置任何标头,以便它知道将其转发到哪个 ip/port?我是说。假设我想向我的 MSN 发送一些数据,就好像我给列表中的某个人写了一些东西一样。我可以使用 sendpacket(),但它只会将数据包/字节数组作为参数,而不是指定发送到哪个应用程序/IP/端口。

谢谢

4

2 回答 2

1

您不会告诉 Winpcap 将数据包发送到何处。你告诉它在电线上放一个数据包。网络交换机会将数据包发送到正确的目的地。接收端的 TCP 堆栈会将数据包发送到正确的应用程序/服务。显然,这意味着路由信息必须在数据包本身中。

以您的示例为例,您需要将相应 MSN 服务器的 IP 地址和 TCP 端口放入数据包中。如果您不这样做,您的网络硬件将丢弃或错误路由该数据包。

于 2009-08-14T14:55:00.197 回答
1

这就是我通过网络发送 ARP 请求的方式。1. 定义协议的结构,即如果你想发送 ARP 数据包,你需要一个包含数据链路层(以太网报头)和网络层(ARP 报头)的结构。相应地,如果您想通过 IP 发送 tcp 数据包,您将需要以太网标头、ip 标头和 tcp 标头的数据结构。

  1. 一旦你定义了结构,用你想要的值初始化结构的一个实例,即如果你想让数据包到达网络中的所有机器,将以太网头的目标 mac 值设置为 ff:ff:ff:ff:ff: ff 如果你想用(IP 地址 192.168.0.88)将数据包发送到机器 X,然后将 ip 层中的目标地址设置为该值。

  2. 完成后,您需要声明一个 char* 数组并将所有结构复制到 char* 数组以创建一个字节序列并通过网络发送它。

//只是为了向您展示我定义结构的意思与//与代码片段的其余部分无关

typedef struct IP_header 
{
    u_char      VersionNInternetHeaderLength;       // Version (4 bits) + Internet header length (4 bits)
    /*u_char        version:4;
    u_char      HeaderLength:4;*/
    u_char      Type;                               // Type of service 
    u_short     TotalLength;                        // Total length 
    u_short     Identification;                     // Identification

    u_char      rsv     : 1;
    u_char      df      : 1;
    u_char      mf      : 1;

    u_char      FragmentOffset1 : 5;
    u_char      FragmentOffset2;
    //u_short       Flags_fo;                           // Flags (3 bits) + Fragment offset (13 bits)

    u_char      TimeToLive;                         // Time to live
    u_char      Protocol;                           // Next level Protocol of the encapsulated payload
    u_short     Checksum;                           // Header checksum
    IP_address  SourceAddress;                      // Source address
    IP_address  DestinationAddress;                 // Destination address
    u_int       OptionNPadding;                     // Option + Padding

    IP_header()
    {
        mf = 0;
        rsv = 0;
        df = 0;
        FragmentOffset1 = 0;
        FragmentOffset2 = 0;

        TimeToLive = 128;

        TotalLength = sizeof(IP_header);
        Identification = 0xABCD;
        Checksum = 0xABCD;
        OptionNPadding = 0;
    }
}IP_header;


Ethernet_header EthernetHeader;// = (Ethernet_header*)malloc(sizeof(Ethernet_header));
        ARP_header ARPHeader ;//= (ARP_header*)malloc(sizeof(ARP_header));

        ARPHeader.HardwareType = htons(1);
        ARPHeader.ProtocolType = htons(0x800);
        ARPHeader.OPCODE = htons(1);

        ARPHeader.HeaderLength = 6;
        ARPHeader.ProtocolLength = 4;

        ARPHeader.SenderMAC = MY_FAKE_MAC;
        ARPHeader.SenderIP = MY_IP;

        ARPHeader.TargetMAC = MAC_address();
        ARPHeader.TargetIP = Whose;

        EthernetHeader.DestinationMAC = BROADCASTMAC;
        EthernetHeader.SourceMAC = MY_FAKE_MAC;
        EthernetHeader.EtherType = htons(0x806);

        u_char* packet = (u_char*)malloc(sizeof(EthernetHeader) + sizeof(ARPHeader));

        memcpy(packet, &EthernetHeader, sizeof(EthernetHeader));
        memcpy(packet + sizeof(EthernetHeader), &ARPHeader, sizeof(ARPHeader));

        SendPacket(packet);
于 2012-08-20T19:43:54.590 回答