簡體   English   中英

Winpcap簡單問題-如何將數據包發送到指定的IP /端口?

[英]Winpcap simple question - how to send packets to a specified ip/port?

我閱讀了教程等等,但是我沒有理解。 它確實允許您發送數據包,但是如何告訴Winpcap將數據包發送到哪里呢? 我應該在數據包上放任何頭,以便它知道將其轉發到哪個ip /端口嗎? 我的意思是。 假設我想向MSN發送一些數據,就好像我已經向列表中的某人寫了一些東西一樣。 我可以使用sendpacket(),但它只會將數據包/字節數組作為參數,而不指定要發送到哪個應用程序/ ip /端口。

謝謝

這就是我通過電線發送ARP請求的方式。 1.定義協議的結構,即,如果要發送ARP數據包,則需要一個包含數據鏈路層(以太網頭)和網絡層(ARP頭)的結構。 相應地,如果要通過IP發送tcp數據包,則將需要一個用於以太網頭,ip頭和tcp頭的數據結構。

  1. 一旦定義了結構,請使用所需的值初始化該結構的實例,即,如果您希望數據包到達網絡中的所有計算機,請將以太網頭的目標mac值設置為ff: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);

您不會告訴Winpcap將數據包發送到哪里。 您告訴它在網絡上放一個小包。 網絡交換機會將數據包發送到正確的目的地。 接收端的TCP堆棧會將數據包發送到正確的應用程序/服務。 顯然,這意味着路由信息必須在數據包本身中。

以您的示例為例,您需要在數據包中放入適當的MSN服務器的IP地址和TCP端口。 如果不這樣做,您的網絡硬件將丟棄或錯誤路由該數據包。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM