是否有任何debian Linux程序的命令可以在C程序中調用,用來表示數據包的元數據(例如協議,數據包長度,源和目標端口)?我會使用readFrom和sockaddr *結構,但我也希望能夠接收TCP通信。顯示鏈接層頭的內容
是否有任何方式使用tcpdump來創建包含此信息的字符串?
此外,這個問題的表達或內容有什麼概念上的錯誤?
是否有任何debian Linux程序的命令可以在C程序中調用,用來表示數據包的元數據(例如協議,數據包長度,源和目標端口)?我會使用readFrom和sockaddr *結構,但我也希望能夠接收TCP通信。顯示鏈接層頭的內容
是否有任何方式使用tcpdump來創建包含此信息的字符串?
此外,這個問題的表達或內容有什麼概念上的錯誤?
您可以使用的各種選擇: 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帶外殼的,如果你不想代碼,這是足以滿足您的需求(看看男人的參數)
您可以在C程序中使用像PCAP一樣的數據包捕獲庫。您可以捕獲整個數據包並分析其內容。你甚至可以應用包過濾。
就閱讀而言,您可以像插入文件描述符一樣讀取系統調用的任何其他設備或文件,從套接字讀取數據。
我必須包括什麼庫使用pcap? 此外,我試圖在我的程序中使用tcpdump,並將參數-e與結果混合使用。我如何才能打印來自特定客戶端的數據包?如何將命令的打印輸出轉換爲我可以在代碼中使用的字符串? – 2014-11-11 21:43:34
所有這一切,你可以谷歌。在gcc中使用libpcap(選項-lpcap)。對於其他問題,您可以在stackoverflow或其他網站找到很多好的回覆。 – rodolk 2014-11-12 14:45:02