您的位置:首页 > 其它

WinPcap 数据包 发送过程 

2009-11-10 13:13 375 查看
if( Sync ){/*处理与时间戳的同步发送*/
[align=left] [/align]
[align=left]//如果需要阻塞超过约1秒,释放应用程序[/align]
[align=left] if( winpcap_hdr->ts.tv_sec - BufStartTime.tv_sec > 1 )[/align]
[align=left] { [/align]
[align=left] //等待挂起的发送完成[/align]
[align=left] NPF_WaitEndOfBufferedWrite(Open);[/align]
[align=left] NPF_StopUsingBinding(Open);[/align]
[align=left] return (INT)((PCHAR)winpcap_hdr - UserBuff);[/align]
[align=left] } [/align]
[align=left] [/b][/align]
[align=left]//计算在发送下一个数据包之前等待的时间间隔[/align]
[align=left] TargetTicks.QuadPart = StartTicks.QuadPart +[/align]
[align=left](LONGLONG)([/align]
[align=left](winpcap_hdr->ts.tv_sec – [/align]
[align=left]BufStartTime.tv_sec) * 1000000 +[/align]
[align=left]winpcap_hdr->ts.tv_usec - BufStartTime.tv_usec) *[/align]
[align=left](TimeFreq.QuadPart[/align]
[align=left])/1000000;[/align]
[align=left] [/align]
[align=left] //等待直到时间间隔逝去[/align]
[align=left] [/b]while( CurTicks.QuadPart <= TargetTicks.QuadPart )[/align]
[align=left] CurTicks = KeQueryPerformanceCounter(NULL);[/align]
[align=left] } [/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] NPF_StopUsingBinding(Open);[/align]
[align=left] //返回已发送的字节数[/align]
[align=left] return (INT)((PCHAR)winpcap_hdr - UserBuff);[/align]

[align=left]}[/align]
[align=left]函数PacketSendPackets通过NPF_IoControl函数调用NPF_BufferedWrite函数时需要考虑下列两个问题的处理:[/align]
[align=left]Ø 数据包队列并不一定是一次全部传递给内核,可能分几次,所以NPF_BufferedWrite函数需要返回的字节大小需要进行头部对齐。[/align]
[align=left]Ø 延迟时间的处理。[/align]
[align=left] 在PacketSendPackets与NPF_BufferedWrite两个函数中都能看见如下所示的类似的忙等待代码。[/align]

[align=left]INT PacketSendPackets(LPADAPTER AdapterObject, [/align]
[align=left]PVOID PacketBuff, ULONG Size, BOOLEAN Sync)[/align]
[align=left]{[/align]
[align=left]…[/align]
[align=left]//等待时间间隔的逝去[/align]
[align=left] while( CurTicks.QuadPart <= TargetTicks.QuadPart )[/b][/align]
[align=left] QueryPerformanceCounter(&CurTicks);[/b][/align]
[align=left]…[/b][/align]
[align=left]}[/b][/align]
[align=left] [/b][/align]
[align=left]INT NPF_BufferedWrite([/align]
[align=left] IN PIRP Irp, [/align]
[align=left] IN PCHAR UserBuff, [/align]
[align=left] IN ULONG UserBuffSize, [/align]
[align=left] BOOLEAN Sync)[/align]
[align=left]{[/align]
[align=left]…[/b][/align]
[align=left]//等待直到时间间隔逝去[/align]
[align=left] while( CurTicks.QuadPart <= TargetTicks.QuadPart )[/b][/align]
[align=left] CurTicks = KeQueryPerformanceCounter(NULL);[/b][/align]
[align=left] …[/align]

[align=left]} [/align]
[align=left]对于发送队列发送方式的时间间隔的图示如下图:[/align]


[/b]
[align=center]图9-7 等待时间间隔示意图[/b][/align]
[align=left]在NPF_BufferedWrite函数中处理每个包之间的时间间隔,而在PacketSendPackets函数中处理每块数据包之间的时间间隔,这与第一个问题相关。这也就是在PacketSendPackets与NPF_BufferedWrite两个函数中都能看见类似的忙等待代码的原因之所在。[/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: