winpcap使用 傳送資料報

2021-06-02 20:02:33 字數 1985 閱讀 2455

傳送資料報是winpcap的擴充套件功能,並不是libpcap本身具備的,所以不能工作在linux下。利用pcap_sendpacket()函式可以傳送單個資料報,其函式原型為: int pcap_sendpacket ( pcap_t * p, u_char * buf, int size ) 說明:該函式可以傳送乙個原始資料報到網路上。buf包含要傳送到網路上的資料報的資料(包括協議頭)。返回值為0說明資料報已經成功的傳送了,否則返回-1。該函式直接將buf裡面的內容作為單個資料報傳送到網路上,不會經過任何處理。

另外乙個可以傳送資料報的函式就是pcap_sendpacket(),它首先將要傳送的資料報放在乙個佇列裡面,然後挨個傳送。佇列有大小,大小表明了它能夠存放的資料報的最大數量。傳送佇列是通過呼叫

pcap_sendqueue_alloc()

函式來建立的,建立時要指定所需建立的佇列的大小。一旦佇列建立完畢,就可以使用

pcap_sendqueue_queue()

來存放乙個資料報在佇列裡面。此函式獲得乙個帶有時間戳,長度,資料報緩衝區的

pcap_pkthdr

。這些引數同樣被

pcap_next_ex()

和函式pcap_handler()

接收。因此,把乙個剛捕獲的或者從檔案中讀取出來的資料報放到佇列中去就是把資料報作為引數傳遞給

pcap_sendqueue_queue()。

下面的函式,是利用佇列來傳送的,讀取f盤下面的某個pcap檔案,然後存放到佇列中,然後傳送出去。傳送的網絡卡需要自己輸入,程式執行後,利用抓包軟體就可以看到發出去的所有報文:

#define home_remote

#define wpcap

#include "pcap.h"

void main()

/**指定從哪個網絡卡傳送資料,這裡沒有對輸入的數字進行判斷**/

int i;

printf("please input a network to send packet:");

scanf("%d",&i);

int j = 0;

for(d = temp;j < i-1;j++,d = d->next);

/**開啟pcap檔案**/

char *pcapfile = "f:\\test.pcap";     /*開啟的pcap檔案路徑*/

capfile = fopen(pcapfile,"rb");

if(capfile ==null)

/**求pcap檔案長度**/

fseek(capfile,0,seek_end);

caplen = ftell(capfile) - sizeof(struct pcap_file_header);

fclose(capfile);

/**讀取pcap檔案的內容**/

if((indev = pcap_open_offline(pcapfile,err)) == null)

/**開啟輸出裝置**/

if((outdev = pcap_open_live(d->name,100,1,1000,err)) == null)

/**檢測mac型別是否匹配**/

if(pcap_datalink(indev) != pcap_datalink(outdev))

/**將資料存放到佇列中**/

squeue = pcap_sendqueue_alloc(caplen);

u_int res;

while((res = pcap_next_ex(indev,&pktheader,(const unsigned char **)&pktdata)) == 1)

}if(res == -1)

/**傳送佇列資料**/

if((res = pcap_sendqueue_transmit(outdev,squeue,1)) < squeue->len)

pcap_sendqueue_destroy(squeue);

return;

}來自: 

WinPcap程式設計 6 過濾 分析資料報

winpcap和libpcap的最強大的特性之一,是擁有過濾資料報的引擎。它提供了有效的方法去獲取網路中的某些資料報,這也是winpcap捕獲機制中的乙個組成部分。用來過濾資料報的函式是 pcap compile 和 pcap setfilter pcap compile 它將乙個高層的布林過濾表示...

使用 UDP 資料報傳送訊息

使用 udp 資料報傳送短的文字訊息實現是很簡單的並且提供可乙個非常輕量級的訊息傳遞通道。但是這種模式有很大的缺陷,就是不保證的資料的可靠性,有可能會存在丟包的情況,甚至嚴重的情況就是伺服器不可用的時候,會完全丟失你的訊息。不過這個任務會在有些情況下十分有作用 你不關心訊息是否丟失 你不想要終止程式...

librtmp傳送AVC,AAC資料報

1.librtmp的包結構 cpp view plain copy typedef struct rtmppacket rtmppacket packet m headertype 可以定義如下 cpp view plain copy define rtmp packet size large 0 ...