您的位置:首页 > 其它

深度剖析WinPcap之(八)——打开与关闭适配器(15)

2010-06-23 10:23 405 查看
本文转自http://eslxf.blog.51cto.com/918801/209123



1.5.2.1.7 PacketSetMinToCopy函数
函数PacketSetMinToCopy定义最少字节数,对适配器执行一次读操作时,内核缓冲区中数据要求达该字节数后,读操作才可返回。函数原型如下:

BOOLEAN PacketSetMinToCopy(LPADAPTER AdapterObject,int nbytes);

参数AdapterObject是一个指向一个_ADAPTER结构体的指针。参数nbytes是,对该适配器执行一次读操作时,内核缓冲区中数据要求达到该最少字节数后,读操作才可返回。
如果函数成功,返回非0值。

如果是一个很大的值,内核接收几个数据包后才把数据复制到用户层。这保证少量的系统调用,也就是,低的处理器占用与更好的性能,该方式对嗅探器是一个不错的设置。
相反的,一个小的值意味着内核只要一接收到数据包,就尽可能快的把数据包复制给准备接收它的应用程序。建议需要内核具有更好响应的实时应用程序(比如一个网桥) 采用该方式。
函数主要调用下列语句实现:

Result = (BOOLEAN)DeviceIoControl(AdapterObject->hFile,

BIOCSMINTOCOPY,&nbytes,4,NULL,0,&BytesReturned,NULL);

最后由NPF驱动程序的NPF_IoControl函数的case BIOCSMINTOCOPY: 分支语句在底层实现。
1.5.2.1.8 PacketSetReadTimeout函数
函数PacketSetReadTimeout设置一个适配器上读操作的超时时间。函数原型如下:

BOOLEAN PacketSetReadTimeout(LPADAPTER AdapterObject,int timeout);

参数AdapterObject指向一个_ADAPTER结构体,参数timeout为超时时间,以毫秒为单位,在AdapterObject适配器上调用PacketReceivePacket函数后,如果在timeout时间内没有数据包到达,将放弃该调用。
把timeout设置为0意味着无超时,也就是说如果没有数据包到达PacketReceivePacket从不返回。Timeout为-1,导致PacketReceivePacket总是立即返回。
如果函数成功,返回非0值,
注意:在适配器工作于统计模式下,该函数可用来设置两个统计报告之间的时间间隔。
函数的主要代码如下:

BOOLEAN PacketSetReadTimeout(LPADAPTER AdapterObject,int timeout)

{
BOOLEAN Result;

AdapterObject->ReadTimeOut = timeout;

if(AdapterObject->Flags == INFO_FLAG_NDIS_ADAPTER)
{
Result = TRUE;
}
else
{//一个未知类型的适配器请求设置超时时间

Result = FALSE;
}

return Result;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: