深度剖析WinPcap之(九)——数据包的发送过程(8)
生活随笔
收集整理的這篇文章主要介紹了
深度剖析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ù)包的前綴。WinPcap或libpcap在文件中存儲數(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 5种iterator
- 下一篇: CCNA学习与实验指南(640-802)