发送多个数据到功能

时间:2018-10-22 12:48:34

标签: c

我正在尝试将多个数据发送到一个函数,该函数进一步接收数据并将其发送到另一个函数以进行数据库插入。我尝试使用指针引用数据,但是由于某种原因,它没有收到我想要的数据。要发送的数据如下:

void print_ethernet_data(const u_char *Buffer , int Size){

unsigned char dest_mac[6]; unsigned char src_mac[6];
struct ether_header *eth = (struct ether_header *)Buffer;

    printf( "\n");
    printf( "Ethernet Header\n");
    printf( "   |-Destination Address : %.2X:%.2X:%.2X:%.2X:%.2X:%.2X \n", eth->dhost[0] , eth->dhost[1] , eth->dhost[2] , eth->dhost[3] , eth->dhost[4] , eth->dhost[5] );
    printf( "   |-Source Address      : %.2X:%.2X:%.2X:%.2X:%.2X:%.2X \n", eth->shost[0] , eth->shost[1] , eth->shost[2] , eth->shost[3] , eth->shost[4] , eth->shost[5] );
    printf( "   |-Protocol            : %u \n",(unsigned short)eth->type);
    *dest_mac = &eth->dhost;
    *src_mac = &eth->shost;
    handledata(Buffer + header_size , Size - header_size, &dest_mac, &src_mac);  //This is the function called
}

这里ether_header定义为:

struct ether_header {
    unsigned char dhost[ETHER_ADDR_LEN];    // Destination host address
    unsigned char shost[ETHER_ADDR_LEN];    // Source host address
    unsigned short type;                    // IP? ARP? RARP? etc
};

被调用函数handledata如下:

void handledata(struct sniff_dns* dns, int size, unsigned char* dest_mac, unsigned char** src_mac)
{

    //RECEIVEING DATA HERE-------------------------------
    printf("DST_MAC = %.2X:%.2X:%.2X:%.2X:%.2X:%.2X\n",dest_mac[0], dest_mac[1], dest_mac[2], dest_mac[3], dest_mac[4], dest_mac[5]);
    printf("SRC_MAC = %.2X:%.2X:%.2X:%.2X:%.2X:%.2X\n",src_mac[0], src_mac[1], src_mac[2], src_mac[3], src_mac[4], src_mac[5]);
    insert_in_db(&dst_mac, &src_mac);    //How should I handle this function and its call?
}

我想要的输出与我期望的完全不同。我已经打印了两个输出,它们是不同的。我猜第二个是指向上面在eth->dhosteth->shost

中定义的数组的地址

输出:

|-Destination Address : E4:FC:82:FD:32:C1 
|-Source Address      : 58:49:3B:38:B5:11 
|-DST_MAC = 86:64:98:46:2E:7F   //They are different from the ones above
|-SRC_MAC = 4698648C:00:00:00:00:00 //This one too

如果有人可以帮助我,我将不胜感激。另外,如何将数据传递到insert_in_db()函数并在其中处理?预先感谢

3 个答案:

答案 0 :(得分:1)

您在代码中使用

struct ether_header *eth = (struct ether_header *)Buffer;

这只是指针转换(最初的Bufferconst u_char),而不是数据处理。

如果您的函数接收字节数组,则需要转换为struct ether_header。 因此,如果Buffer中的字节顺序与dhost(和/或shost)中的所需顺序相对应,请考虑使用memcpy function

复制数据

答案 1 :(得分:1)

您将dest_macsrc_mac定义为数组,然后尝试将它们用作没有意义的指针。我猜您希望这些变量指向缓冲区中的数据。如果是这种情况,请使用指针而不是数组。

void print_ethernet_data(const u_char *Buffer , int Size){

unsigned char *dest_mac; unsigned char *src_mac;
struct ether_header *eth = (struct ether_header *)Buffer;

    printf( "\n");
    printf( "Ethernet Header\n");
    printf( "   |-Destination Address : %.2X:%.2X:%.2X:%.2X:%.2X:%.2X \n", eth->dhost[0] , eth->dhost[1] , eth->dhost[2] , eth->dhost[3] , eth->dhost[4] , eth->dhost[5] );
    printf( "   |-Source Address      : %.2X:%.2X:%.2X:%.2X:%.2X:%.2X \n", eth->shost[0] , eth->shost[1] , eth->shost[2] , eth->shost[3] , eth->shost[4] , eth->shost[5] );
    printf( "   |-Protocol            : %u \n",(unsigned short)eth->type);
    dest_mac = eth->dhost;
    src_mac = eth->shost;
    handledata(Buffer + header_size , Size - header_size, &dest_mac, &src_mac);  //This is the function called
}

您的其他函数也需要修复src_mac变量,因为您将其定义为指向指针的指针,而不仅仅是指向char的普通指针。

void handledata(struct sniff_dns* dns, int size, unsigned char* dest_mac, unsigned char* src_mac)
{

    //RECEIVEING DATA HERE-------------------------------
    printf("DST_MAC = %.2X:%.2X:%.2X:%.2X:%.2X:%.2X\n",dest_mac[0], dest_mac[1], dest_mac[2], dest_mac[3], dest_mac[4], dest_mac[5]);
    printf("SRC_MAC = %.2X:%.2X:%.2X:%.2X:%.2X:%.2X\n",src_mac[0], src_mac[1], src_mac[2], src_mac[3], src_mac[4], src_mac[5]);

    insert_in_db(dst_mac, src_mac);    //How should I handle this function and its call?
}

最后,在调用insert_in_db函数时,您可以仅传递指针而不是传递指针的地址。我认为您应该阅读有关指针的内容。

答案 2 :(得分:1)

存在许多与指针有关的错误。总体建议是提高您对指针工作原理的了解,并学习使用调试器。

错误1:在函数handledata中,参数src_mac的类型应该是指针,而不是指向指针的指针。

错误2:此代码:*dest_mac = &eth->dhost;仅分配给dest_mac的第一个元素。另外,它会分配eth->dhost的地址,而您想分配值。

这将正常工作,并且更简单,例如:

void print_ethernet_data(const u_char *Buffer, int Size) {
    unsigned char* dest_mac;
    unsigned char* src_mac;
    struct ether_header *eth = (struct ether_header *)Buffer;
    dest_mac = eth->dhost;
    src_mac = eth->shost;
    handledata(Buffer + header_size , Size - header_size, dest_mac, src_mac);
}