首页 文章

用libnet在C中创建arp包

提问于
浏览
1

我想知道在创建框架后如何发送框架 .

我有下一个:

int arp_send(libnet_t * l,int op,u_char * sha,in_addr_t spa,u_char * tha,in_addr_t tpa){
libnet_ptag_t t;

if (sha == NULL &&
    (sha = (u_char *)libnet_get_hwaddr(l)) == NULL) {
    return (-1);
}
if (spa == 0) {
    if ((spa = libnet_get_ipaddr4(l)) == -1)
        return (-1);        
}
if (tha == NULL)
    tha = (u_char *)"\xff\xff\xff\xff\xff\xff";

libnet_clear_packet(l);

/*
 *  Build the packet, remmebering that order IS important.  We must
 *  build the packet from lowest protocol type on up as it would
 *  appear on the wire.  So for our ARP packet:
 *
 *  -------------------------------------------
 *  |  Ethernet   |           ARP             |
 *  -------------------------------------------
 *         ^                     ^
 *         |------------------   |
 *  libnet_build_ethernet()--|   |
 *                               |
 *  libnet_build_arp()-----------|
 */

t = libnet_build_arp(
        ARPHRD_ETHER,                           /* hardware addr */
        ETHERTYPE_IP,                           /* protocol addr */
        6,                                      /* hardware addr size */
        4,                                      /* protocol addr size */
        op,                                     /* operation type */
        sha,                                    /* sender hardware addr */
        (u_int8_t *)&spa,                       /* sender protocol addr */
        tha,                                    /* target hardware addr */
        (u_int8_t *)&tpa,                       /* target protocol addr */
        NULL,                                   /* payload */
        0,                                      /* payload size */
        l,                                      /* libnet context */
        0);                                     /* libnet id */

if (t == -1)
{
    fprintf(stderr, "Can't build ARP header: %s\n", libnet_geterror(l));
    return -1;
}

t = libnet_autobuild_ethernet(
        tha,                                    /* ethernet destination */
        ETHERTYPE_ARP,                          /* protocol type */
        l);                                     /* libnet handle */

if (t == -1)
{
    fprintf(stderr, "Can't build ethernet header: %s\n",
            libnet_geterror(l));
    return -1;
}    
return libnet_write(l);

}

我在网上找到了代码,它从没有创建arp数据包 . 我确实理解除返回之外的一切,因为我没有找到“发送”命令 .

谢谢 .

1 回答

  • 0

    libnet_write()就是这么做的 .

    Writes a prebuilt packet to the network. The function assumes that l was
    previously initialized (via a call to libnet_init()) and that a
    previously constructed packet has been built inside this context (via one or
    more calls to the libnet_build* family of functions) and is ready to go.
    Depending on how libnet was initialized, the function will write the packet
    to the wire either via the raw or link layer interface. The function will
    also bump up the internal libnet stat counters which are retrievable via
    libnet_stats().
      @param l pointer to a libnet context
      @return the number of bytes written, -1 on error
    

    根据libnet / libnet-functions.h中的注释

相关问题