Простой вопрос Winpcap - как отправлять пакеты на указанный ip/порт?

StackOverflow https://stackoverflow.com/questions/1278294

Вопрос

Я читал учебники и так далее, но не понимаю.Он позволяет отправлять пакеты, но как указать Winpcap, куда отправлять эти пакеты?Есть ли какой-нибудь заголовок, который я должен поместить в пакеты, чтобы он знал, на какой IP/порт их пересылать?Я имею в виду.Давайте представим, что я хочу отправить некоторые данные на свой MSN, как если бы я написал что-то кому-то из моего списка.Я могу использовать sendpacket(), но он будет принимать в качестве аргумента только массив пакетов/байтов, не указывая, в какое приложение/IP/порт его отправить.

Спасибо

Это было полезно?

Решение

Вы не указываете Winpcap, куда отправлять пакеты.Вы говорите ему передать пакет по проводу.Сетевой коммутатор отправит пакет в нужное место назначения.Стек TCP на принимающей стороне отправит пакет нужному приложению/сервису.Очевидно, это означает, что информация о маршрутизации должна находиться в самом пакете.

В вашем примере вам нужно будет поместить в пакет IP-адрес и TCP-порт соответствующего сервера MSN.Если вы этого не сделаете, ваше сетевое оборудование отбросит или неправильно направит этот пакет.

Другие советы

Вот как я отправил запрос ARP по проводу.1.Определите структуры для протоколов, т. е. если вы хотите отправлять пакеты ARP, вам понадобится структура, которая будет содержать уровень канала передачи данных (заголовок Ethernet) и сетевой уровень (заголовок ARP).Соответственно, если вы хотите отправить TCP-пакет по IP, вам понадобится структура данных для заголовка Ethernet, заголовка ip и заголовка TCP.

  1. после того, как вы определили структуры, инициализируйте экземпляр структуры нужными вам значениями, т.е.если вы хотите, чтобы пакет передавался всем машинам в сети, установите значение MAC-адреса назначения заголовка Ethernet равным ff:ff:ff:ff:ff:ff, если вы хотите отправить пакет на компьютер X с (IP-адресом 192.168.0.1. 0.88), затем установите для адреса назначения на уровне 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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top