这是我的第一个C应用程序,所以请原谅。由于速度原因,我正在将基于Python的libpcap
应用程序移植到C上。我在理解如何从数据包中提取信息时遇到问题。它以u_char
的形式出现在我的处理程序函数中,您可以从那里修改它。在python中,我只是将“字符串”切成薄片,然后以这种方式提取我的信息,但我不知道该如何进行。
例如,如何从以太网帧(分别为字节0-6和7-11)提取目标MAC地址和源MAC地址。现在我有:
void handle_sniffed(u_char *args, const struct pcap_pkthdr *header, const u_char *packet) {
u_char *mac_dst = malloc(6*sizeof(u_char));
u_char *mac_src = malloc(6*sizeof(u_char));
memcpy(mac_dst, packet, 6);
memcpy(mac_src, packet+6, 6);
}
我这样做是否正确,现在如何显示MAC地址,例如使用
printf
? 最佳答案
我认为您这样做很好,memcpy()
属性也很好,malloc()
是正确的。您可以像这样使用inline function来分配内存安全/检查分配(您应该检查每个分配):
inline void* s_malloc(size_t size){
void *ptr = malloc( size);
if( !ptr){
printf( "Allocation failed");
exit(1);
}
return ptr;
}
您也可以为此编写宏,但可能无法将其用作函数。如果你们有更好的方法,我会很乐意扩展/编辑。
无论如何,回答您的问题。如何输出MAC地址。这是
prinf()
的手册,请参阅x
。 X
格式。输出十进制数。除非您要打印一个字符长的数字,否则它会很好用。因此,让我们告诉
printf()
打印精度为2个数字.2
的数字。而且我们还需要告诉它应该是“左”填充而不是“右侧的小数位数”,即-
(请检查手册中的所有内容)。因此,用于打印MAC的一个字节的完整字符串为:%-.2X
。完整的示例为:#include <stdio.h>
int main(){
unsigned char data[6] = {0x00, 0xab, 0x03, 0xff, 0xba, 0x10};
printf( "%-.2X:%-.2X:%-.2X:%-.2X:%-.2X:%-.2X\n", data[0], data[1], data[2],
data[3], data[4], data[5]);
return 0;
}
结果:
[vyktor@grepfruit tmp]$ gcc -Wall src.cpp && ./a.out
00:AB:03:FF:BA:10
为了加快速度,您可以构建如下函数:
void print_mac( const unsigned char *data){
printf( "%-.2X:%-.2X:%-.2X:%-.2X:%-.2X:%-.2X\n", data[0], data[1], data[2],
data[3], data[4], data[5]);
}
// Usage example:
printf( "SrcMAC: ");
print_mac(packet+6);
printf( "DstMAC: ");
print_mac(packet);
当然,这样做可能是更好的方法。我试图使这一过程变得清晰而有教育意义,如果您什么都不懂,请随时在评论中提问
关于c - C指针和内存(PCAP和数据包处理),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9301129/