2014-11-08 127 views
0

是否有任何debian Linux程序的命令可以在C程序中調用,用來表示數據包的元數據(例如協議,數據包長度,源和目標端口)?我會使用readFrom和sockaddr *結構,但我也希望能夠接收TCP通信。顯示鏈接層頭的內容

是否有任何方式使用tcpdump來創建包含此信息的字符串?

此外,這個問題的表達或內容有什麼概念上的錯誤?

回答

0

您可以使用的各種選擇: 1-PCAP如Jewel Thief所述。示例代碼:

int datalink; 
char *device; 
pcap_t *pd; 
int snaplen = MAX_MSG_LEN; 
#define CMD "tcp and dst port %d" 

void open_pcap() 
{ 
    uint32_t localnet; 
    uint32_t netmask; 
    char cmd[300]; 
    char errbuf[PCAP_ERRBUF_SIZE]; 
    struct bpf_program fcode; 

    device = pcap_lookupdev(errbuf); 
    if (device == NULL) 
    { 
     printf("ERROR-1: open_pcap:%s\n", errbuf); 
     exit(3); 
    } 

    printf("DEVICE: %s\n", device); 

    pd = pcap_open_live(device, snaplen, 0, 500, errbuf); 

    if (pd == NULL) 
    { 
     printf("ERROR-2-%s\n", errbuf); 
     exit(4); 
    } 

    if (pcap_lookupnet(device, &localnet, &netmask, errbuf) < 0) 
    { 
     printf("ERROR-3-%s\n", errbuf); 
     exit(5); 
    } 

    snprintf(cmd, sizeof(cmd), CMD, 80); 

    if (pcap_compile(pd, &fcode, cmd, 0, netmask) < 0) 
    { 
     printf("ERROR-4-%s\n", pcap_geterr(pd)); 
     exit(6); 
    } 

    if (pcap_setfilter(pd, &fcode) < 0) 
    { 
     printf("ERROR-5-%s\n", pcap_geterr(pd)); 
     exit(7); 
    } 

    datalink = pcap_datalink(pd); 

    if (datalink < 0) 
    { 
     printf("ERROR-6-%s\n", pcap_geterr(pd)); 
     exit(8); 
    } 

    printf("DATALINK: %d\n", datalink); 
} 

int getNext(char *msg) 
{ 
    struct pcap_pkthdr hdr; 
    char *ptr = NULL; 

    while(ptr == NULL) 
    { 
     ptr = (char *)pcap_next(pd, &hdr); 
    } 

    printf("LEN: %d - CAPLEN: %d\n", hdr.len, hdr.caplen); 
    memcpy(msg, ptr, hdr.caplen); 

    return hdr.caplen; 
} 

2 - 您可以使用包套接字

#include <sys/socket.h> 
#include <linux/if_packet.h> 
#include <net/ethernet.h> /* the L2 protocols */ 

packet_socket = socket(AF_PACKET, int socket_type, int protocol); 

3,你可以調用命令的tcpdump帶外殼的,如果你不想代碼,這是足以滿足您的需求(看看男人的參數)

+0

我必須包括什麼庫使用pcap? 此外,我試圖在我的程序中使用tcpdump,並將參數-e與結果混合使用。我如何才能打印來自特定客戶端的數據包?如何將命令的打印輸出轉換爲我可以在代碼中使用的字符串? – 2014-11-11 21:43:34

+0

所有這一切,你可以谷歌。在gcc中使用libpcap(選項-lpcap)。對於其他問題,您可以在stackoverflow或其他網站找到很多好的回覆。 – rodolk 2014-11-12 14:45:02

0

您可以在C程序中使用像PCAP一樣的數據包捕獲庫。您可以捕獲整個數據包並分析其內容。你甚至可以應用包過濾。

就閱讀而言,您可以像插入文件描述符一樣讀取系統調用的任何其他設備或文件,從套接字讀取數據。

相關問題