我正在尝试将多个数据发送到一个函数,该函数进一步接收数据并将其发送到另一个函数以进行数据库插入。我尝试使用指针引用数据,但是由于某种原因,它没有收到我想要的数据。要发送的数据如下:
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 = ð->dhost;
*src_mac = ð->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->dhost
和eth->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()
函数并在其中处理?预先感谢
答案 0 :(得分:1)
您在代码中使用
struct ether_header *eth = (struct ether_header *)Buffer;
这只是指针转换(最初的Buffer
是const u_char
),而不是数据处理。
如果您的函数接收字节数组,则需要转换为struct ether_header
。
因此,如果Buffer
中的字节顺序与dhost
(和/或shost
)中的所需顺序相对应,请考虑使用memcpy function
答案 1 :(得分:1)
您将dest_mac
和src_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 = ð->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);
}