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

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; 
}
 

你可能感兴趣的:(职场,休闲,winpcap)