日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

深度剖析WinPcap之(九)——数据包的发送过程(8)

發(fā)布時間:2025/3/15 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深度剖析WinPcap之(九)——数据包的发送过程(8) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1.7.3??? 發(fā)送隊列方式的接口實現(xiàn)

1.7.3.1???????????? PacketSendPackets函數(shù)

函數(shù)發(fā)送數(shù)據(jù)包隊列到網(wǎng)絡,函數(shù)原型如下:

INT PacketSendPackets(LPADAPTER AdapterObject,

PVOID PacketBuff, ULONG Size, BOOLEAN Sync)

參數(shù)AdapterObject指向一個_ADAPTER結(jié)構體,該結(jié)構體表示將發(fā)送數(shù)據(jù)包的網(wǎng)絡適配器。

參數(shù)PacketBuff指向待發(fā)送數(shù)據(jù)包的緩沖區(qū)。

參數(shù)Size為參數(shù)PacketBuff所指緩沖區(qū)的大小。

參數(shù)Sync如果為TRUE則根據(jù)時間戳發(fā)送數(shù)據(jù)包。如果為FALSE,則不根據(jù)時間戳,而是盡所能的快速發(fā)送各數(shù)據(jù)包。

函數(shù)返回值為實際所發(fā)送的字節(jié)數(shù),如果該值小于Size參數(shù)規(guī)定的大小,那么發(fā)送過程中出現(xiàn)了錯誤。錯誤可能由驅(qū)動程序/適配器的問題或沖突的/假的數(shù)據(jù)包緩沖區(qū)導致。

該函數(shù)用來發(fā)送一個原始數(shù)據(jù)包緩沖區(qū)的內(nèi)容到網(wǎng)絡。該緩沖區(qū)能夠包含任意數(shù)目的原始數(shù)據(jù)包,每個數(shù)據(jù)包都有一個dump_bpf_hdr結(jié)構體作為數(shù)據(jù)包的前綴。WinPcaplibpcap在文件中存儲數(shù)據(jù)包使用一樣的dump_bpf_hdr結(jié)構體,因此可以很直接的發(fā)送一個捕獲的數(shù)據(jù)包文件。'Raw packets'意味著發(fā)送應用程序?qū)⒉坏貌话瑓f(xié)議頭,既然每個數(shù)據(jù)包照原來的樣子被發(fā)送到網(wǎng)絡。但是數(shù)據(jù)包的CRC并不需要計算,明顯地,它將被網(wǎng)絡接口添加。

注意:使用該函數(shù) 比直接使用一連串PacketSendPacket函數(shù)更有效率,因為數(shù)據(jù)包被緩沖到內(nèi)核驅(qū)動,因此上下文的切換明顯降低了。

注意:當Sync設置為TRUE,那么內(nèi)核中的數(shù)據(jù)包將與一個高精度時間戳同步發(fā)送。這個操作需要消耗大量的CPU資源,但數(shù)據(jù)包的發(fā)送通常很精確(可達數(shù)微秒左右),這依賴于機器的性能計數(shù)器(performance counter)的精度。如此精度是采用pcap_sendpacket函數(shù)不可能達到的。

INT PacketSendPackets(LPADAPTER AdapterObject,

PVOID PacketBuff, ULONG Size, BOOLEAN Sync)

{

??? BOOLEAN?????? ? Res;

??? DWORD???????? ? BytesTransfered, TotBytesTransfered=0;

??? struct timeval BufStartTime;

??? LARGE_INTEGER ? StartTicks, CurTicks, TargetTicks, TimeFreq;

?

??? if (AdapterObject->Flags == INFO_FLAG_NDIS_ADAPTER)

??? {

?????? /*獲得發(fā)送隊列的起始時間戳*/

?????? BufStartTime.tv_sec =

((struct timeval*)(PacketBuff))->tv_sec;

?????? BufStartTime.tv_usec =

((struct timeval*)(PacketBuff))->tv_usec;

?

/*獲的參考的時間計數(shù)器*/

?????? QueryPerformanceCounter(&StartTicks);

?????? QueryPerformanceFrequency(&TimeFreq);

?????? CurTicks.QuadPart = StartTicks.QuadPart;

?

?????? do{

?????????? //把數(shù)據(jù)發(fā)送給驅(qū)動程序

?????????? Res = (BOOLEAN)DeviceIoControl(

AdapterObject->hFile,

?????????? ? (Sync)?BIOCSENDPACKETSSYNC:BIOCSENDPACKETSNOSYNC,

????????????? (PCHAR)PacketBuff + TotBytesTransfered,

????????????? Size - TotBytesTransfered,

????????????? NULL,

????????????? 0,

????????????? &BytesTransfered,

????????????? NULL);

?

?????????? TotBytesTransfered += BytesTransfered;

?

?????????? //從循環(huán)中退出,發(fā)送結(jié)束或出錯

???????? ? if(TotBytesTransfered >= Size || Res != TRUE)

????????????? break;

?

?????????? //計算發(fā)送下一塊數(shù)據(jù)的時間間隔

?????????? TargetTicks.QuadPart =

StartTicks.QuadPart +

(LONGLONG)((((struct timeval*)

((PCHAR)PacketBuff + TotBytesTransfered))->tv_sec –

BufStartTime.tv_sec) * 1000000

+

(((struct timeval*)

((PCHAR)PacketBuff + TotBytesTransfered))->tv_usec

?- BufStartTime.tv_usec)) *(TimeFreq.QuadPart

) / 1000000;

??????????

?????????? //等待時間間隔的逝去

?????????? while( CurTicks.QuadPart <= TargetTicks.QuadPart )

????????????? QueryPerformanceCounter(&CurTicks);

?

?????? }

?????? while(TRUE);

??? }

??? else

??? {//錯誤,未知設備類型

?????? TotBytesTransfered = 0;

??? }

?

??? return TotBytesTransfered;

}

本文出自 “千江月” 博客,請務必保留此出處http://eslxf.blog.51cto.com/918801/214880

轉(zhuǎn)載于:https://blog.51cto.com/runhook/387939

總結(jié)

以上是生活随笔為你收集整理的深度剖析WinPcap之(九)——数据包的发送过程(8)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。