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]
[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]
相关文章推荐
- 深度剖析WinPcap之(九)――数据包的发送过程(1)
- 深度剖析WinPcap之(九)――数据包的发送过程(10)
- 深度剖析WinPcap之(九)——数据包的发送过程(7)
- 深度剖析WinPcap之(九)——数据包的发送过程(14)(完)
- 深度剖析WinPcap之(九)――数据包的发送过程(2)
- 深度剖析WinPcap之(九)――数据包的发送过程(11)
- 深度剖析WinPcap之(九)——数据包的发送过程(8)
- 深度剖析WinPcap之(九)――数据包的发送过程(3)
- 深度剖析WinPcap之(九)――数据包的发送过程(4)
- 深度剖析WinPcap之(九)――数据包的发送过程(12)
- 深度剖析WinPcap之(九)——数据包的发送过程(1)
- 深度剖析WinPcap之(九)——数据包的发送过程(9)
- 深度剖析WinPcap之(九)――数据包的发送过程(5)
- 深度剖析WinPcap之(九)――数据包的发送过程(13)
- 深度剖析WinPcap之(九)——数据包的发送过程(2)
- 深度剖析WinPcap之(九)——数据包的发送过程(10)
- 深度剖析WinPcap之(九)――数据包的发送过程(6)
- 深度剖析WinPcap之(九)――数据包的发送过程(13-2)
- 深度剖析WinPcap之(九)——数据包的发送过程(3)
- 深度剖析WinPcap之(九)——数据包的发送过程(11)