各位高手,我有几个有关网卡的问题,还望各位高手能指点一下。
1、网卡(局域网连接正常)在计算机工作时和计算机处于关机状态这两种情况下有何不同?如用程序来检测这两种情况应该如何处理?
2、如在一个有双网卡的计算机上,如何用程序实现对其中一块网卡的禁用和启用?
再附带一个tracert的命令我在书上看到用这个命令可以检测路由器,如tracert www.sohu.com
会显示一连窜的路由器ip地址及其相应的数据回复,可我试了一下,只能找到学校自己的路由器(第一个路由器),后面的路由器request timeout
这是不是因为那些路由器装了防火墙,阻止了外部对其的这种探测?还望各路高手多多指教,小弟先谢了!高分!不够再给!

解决方案 »

  1.   

    1.是不是可以通过ping命令来检查呀!!!
    2.程序代码如下:
    #include "stdafx.h"
    #include <tchar.h>    
    #include <windows.h>  
    #include <setupapi.h>#pragma comment (lib,"setupapi")#define UnknownDevice TEXT("<Unknown Device>")HDEVINFO hDevInfo = 0;
    BOOL StateChange(DWORD NewState, DWORD SelectedItem,HDEVINFO hDevInfo)
    {
        SP_PROPCHANGE_PARAMS PropChangeParams = {sizeof(SP_CLASSINSTALL_HEADER)};
        SP_DEVINFO_DATA DeviceInfoData = {sizeof(SP_DEVINFO_DATA)};
        HCURSOR hCursor;    //
        // This may take a while :^(
        //
        hCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));    //
        // Get a handle to the Selected Item.
        //
        if (!SetupDiEnumDeviceInfo(hDevInfo,SelectedItem,&DeviceInfoData))
        {
            printf("EnumDeviceInfo");
            return FALSE;
        }    //
        // Set the PropChangeParams structure.
        //
        PropChangeParams.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;
        PropChangeParams.Scope = DICS_FLAG_GLOBAL;
        PropChangeParams.StateChange = NewState;     if (!SetupDiSetClassInstallParams(hDevInfo,
            &DeviceInfoData,
            (SP_CLASSINSTALL_HEADER *)&PropChangeParams,
            sizeof(PropChangeParams)))
        {
            printf("SetClassInstallParams");
            SetCursor(hCursor);
            return FALSE;
        }    //
        // Call the ClassInstaller and perform the change.
        //
        if (!SetupDiCallClassInstaller(DIF_PROPERTYCHANGE,
            hDevInfo,
            &DeviceInfoData))
        {
            printf("SetClassInstallParams");
            SetCursor(hCursor);
            return TRUE;
        }    SetCursor(hCursor);
        return TRUE;
    }
    BOOL IsClassNet( GUID * ClassGuid )
    {
        #define MAX_NUM  50    HKEY hKeyClass;
        LONG lRet;
        char ClassType[MAX_NUM];
    char NetClass[MAX_NUM] = "Net";
    DWORD dwLength = MAX_NUM,dwType = REG_SZ;
        
        if (hKeyClass = SetupDiOpenClassRegKey(ClassGuid,KEY_READ))
        {
            lRet = RegQueryValueEx(hKeyClass, 
                TEXT("Class"), 
                NULL, &dwType, LPBYTE(ClassType), &dwLength);
            RegCloseKey(hKeyClass); if (lRet != ERROR_SUCCESS)
    return FALSE; if (!strcmp(ClassType,NetClass))
    return TRUE;
        }                                     return FALSE;
    }int main(int argc, char* argv[])
    {
    if (INVALID_HANDLE_VALUE == (hDevInfo = 
                    SetupDiGetClassDevs(NULL,NULL,0,
                    DIGCF_PRESENT|DIGCF_ALLCLASSES)))
        {
             printf("GetClassDevs");
             return 0;
        }    DWORD i, Status, Problem;
    SP_DEVINFO_DATA DeviceInfoData = {sizeof(SP_DEVINFO_DATA)}; HKEY hKeyClass;
    char DeviceName[200];
    for (i=0;SetupDiEnumDeviceInfo(hDevInfo,i,&DeviceInfoData);i++)
        {
    if (IsClassNet(&DeviceInfoData.ClassGuid))
    {
    printf(" the class's index is %d\n",i);
                               //
    //DICS_DISABLE-->禁用网络
    //DICS_ENABLE--->恢复网络
    //
    if (StateChange(DICS_ENABLE,i,hDevInfo))
    printf("NetWork stopped"); }
    } return 0;
    }
      

  2.   

    是不是用Ping检测,网上有ping实现的代码
    第二点:不懂学习楼上的
      

  3.   

    谢谢大家的关注!
    对于第一个问题,用ping的方法是可以区分我上述所讲的两种情况,因为用ping的话,在关机时时没有响应的数据包,我主要是想知道在关机状态下是否有可能获取网卡的一些信息,以区别是由于网络不通(如网线没有正常连接)还是由于关机而造成采用类似ping的方法而没有收到数据包。
    对于第二个问题,谢谢nanjinhui的热情帮助,但我还不是很明白,程序中许多函数和数据类型我在msdn中没有找到,我的msdn比较老,只有两张盘的,如SetupDiEnumDeviceInfo,SP_PROPCHANGE_PARAMS等都找不到,还望继续指教,谢谢!
    对于第三个问题,我今天在利用Adsl上网的计算机上试了一下tracert的命令
    tracert www.sohu.com结果找到了第2-8个路由器的信息(反应时间和ip地址)
    第一个和后面几个路由器都没有找到继续高度关注,谢谢大家!
      

  4.   

    nanjianhui(nan):
    兄弟,你也将这块代码贴出来了:)
    帮忙搞定一下,如何将某个ip对应的网卡禁掉?
    要快啊,还有
    帮忙看一个程序,不知道为什么不成功。
    http://expert.csdn.net/Expert/topic/2289/2289229.xml?temp=.5295679
    hoho:)
      

  5.   

    搂主,
    我觉得你好像想作检测代理这样的功能(防范代理)?
    用traceroute肯定是不行的。
    如果对方的ip是私网ip,traceroute根本达不到。
    如果对方ip是公网ip,完全也有可能对方的防火墙根本不让icmp包通过,此路不通(:
      

  6.   

    哦,我主要是在做检测网络故障的功能,(检测的网络模型是有几个网段组成的局域网,网络设备包括路由器,交换机,集线器,主机),现在就是想对网络故障的表现加以细分,在一个粗框架上看网络故障表现主要是网络不通,现在困扰我的是如何区分(1)当主机正常关机(2)与主机相连的网路出现故障,因为在这两种情况下,类似用ping的方法是无法区分的,所以我想知道,当网路正常时,主机正常关机情况下网卡是否有其特殊的信息,以及如何用程序来获取这些信息
      

  7.   

    做网管这种东西,用SNMP协议。
    我用过3com的网络管理软件,它显示的拓扑结构非常明确。
    可以看出那些节点是通的(绿--这有可能只是网管可达,实际情况网络不一定好用),
    那些节点出现故障(红)。
    对于红了的点就是故障点。
    对于某个主机是不是网络可达,可以ping它嘛,当然我想用snmp也可以实现的。
    我相当主机掉电以后,这个链路已经不通,就不能获得信息了,你只能在连通的时候获得
    它的信息,我想在主机没有主动响应程序的时候,最多能获得网卡的mac地址(而且必须在同一个网段),主机名等信息吧!
      

  8.   

    哦,我现在做的东西就是基于snmp协议的,其实哪些节点通与不通比较好确定,用类似ping的方法即可实现,但我想在某个节点不通时,确定它不通的原因,有可能是网路中其他节点中断的原因,也有可能是主机关机的原因,也有可能网线接触不好的原因。继续高度关注。大家一起学习!