2012-02-15 72 views
3

這是我的第一個C應用程序,所以請原諒一些無知。出於速度的原因,我正在將基於Python的libpcap應用程序移植到C上。我在理解如何從數據包中提取信息時遇到了問題。它作爲u_char來處理我的處理函數,並且可以從那裏開始。在python中,我只需切分「字符串」並以這種方式提取我的信息,但我不知道如何繼續。C指針和內存(PCAP和數據包處理)

例如,如何I(分別字節0-6和7-11)提取以太網幀中的目的地和源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

回答

1

我認爲你做得很好,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; 
} 

而結果:

[[email protected] 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); 

當然也有可能是更好的辦法做這個。我試圖做到這一點清楚和教育,如果你什麼都不明白,請隨時問在評論

1

數據包嗅探器作爲第一C-程序?令人印象深刻。

在C的適當方式是創建含有單個分組的佈局的結構,可以再投你被給予該結構和去參考例如分組指針持有MAC地址的很長一段時間。

你能告訴我們在哪裏可以找到您收到的數據包的規格,我們可以幫助您創建一個匹配的結構。

+0

我只是捕獲沼澤標準的以太網幀,這就是所有這個程序將不得不做的。我意識到我可以將它轉換爲結構體,對我來說這將是「簡單」的出路(我相信這也是在C中完成它的聰明方式)。我正在遵循http://www.tcpdump.org/pcap.html上的說明,其中包括該演員。我想基本上做一個1:1的Python代碼的端口,因爲這意味着我必須在C中做更多的工作。我使用這種方法來真正將指針和指針算術嵌入我的頭腦中。這是我以前從來沒有能夠包攬頭腦的東西。 – axon 2012-02-15 22:09:16

+1

哇,這是一些練習的核心方式 – 2012-02-15 22:19:59

+0

這樣做將cast-to-struct方式作爲進行復雜內存訪問的可接受方式嗎?不只是在這種情況下,但大多數情況下? – axon 2012-02-16 03:27:18