这是我的第一个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()的手册,请参阅xX格式。输出十进制数。

除非您要打印一个字符长的数字,否则它会很好用。因此,让我们告诉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/

10-11 23:18
查看更多