我的程序将在以下环境中使用:
1.局域网中没有网关和域,不能连上Internet
2.所有计算机都没有自己指定IP,也没有计算机专门提供分配IP的服务
3.所有计算机都拒绝 ping
3.要求在计算机启动后,没有访问任何网络资源,也没有其他计算机来访问的前提下(操作系统自己访问网络,不受该限制)判断局域网是否连通.操作系统可以判断,我想程序也应该可以实现,操作系统应该提供了接口,只是我没有找到。希望高手指教.该贴也是
http://expert.csdn.net/Expert/topic/2599/2599214.xml?temp=.9102289

解决方案 »

  1.   

    对于3:可以把程序写成服务,设置为自动启动!//检查Internet 的连接性
    BOOL  CheckOffline()
    {
        DWORD ConnectState;
        DWORD StateSize;
        StateSize=sizeof(ConnectState);
        BOOL result=false;
        //检查当前的Internet设置是否可用 
        if(InternetQueryOption(NULL,INTERNET_OPTION_CONNECTED_STATE,&ConnectState,StateSize)
        {
           if(ConnectState & INTERNET_STATE_DISCONNECTED != 2)
           {    
           //检查连接到internet了吗?
           if InternetheckConnection('http://www.sohu,com/'1,0)
              GetDlgItem(IDC_EDIT1)->SetDlgItemText(IDC_EDIT1,_T("Connected"));
           else 'DisConnected'
           result = true;
           }
        }
    return result;
    }
      

  2.   

    可以在程序中做,用telnet连接 能连上则同  连不上则不同  当然需要将所有ip都事先输入程序数据库中,一个一个挨着试。:)  我试过了  可以用  我的是测linux的  不知道windows能用否
      

  3.   

    上面那个有点错误!
    //检查Internet 的连接性
    BOOL  CMyGoodsDlg::CheckOnline()
    {
        DWORD ConnectState;
        DWORD StateSize;
        StateSize=sizeof(ConnectState);
        BOOL result=false;
        //检查当前的Internet设置是否可用 
        if(InternetQueryOption(NULL,INTERNET_OPTION_CONNECTED_STATE,&ConnectState,&StateSize))
        {
    if((ConnectState & INTERNET_STATE_DISCONNECTED) != 2)
    {    
    //检查连接到internet了吗?
    if (InternetCheckConnection("http://www.sohu.com/",1,0))
    {
    GetDlgItem(IDC_TESTALT)->SetDlgItemText(IDC_TESTALT,_T("Connected"));
    result = true;
    }
    else GetDlgItem(IDC_TESTALT)->SetDlgItemText(IDC_TESTALT,_T("DisConnected"));
    }
        }
    return result;
    }
    //是否上网   //INTERNET_CONNECTED_INFO
    void CMyGoodsDlg::OnIsonline() 
    {  CheckOnline();
     return ;    DWORD flags;     //上网方式
        InternetGetConnectedState(&flags,0);

        if( (flags & INTERNET_CONNECTION_MODEM) || (flags & INTERNET_CONNECTION_LAN) ||
     (flags & INTERNET_CONNECTION_PROXY))   {
    TCHAR bufferpath[_MAX_PATH];
    PTCHAR pBuf;
    pBuf=bufferpath;
    GetSystemDirectory(pBuf,_MAX_PATH);
    PTCHAR pPos=_tcsstr(pBuf,_T("System32"));
    VERIFY((pPos-pBuf-1)>0);
    bufferpath[pPos-pBuf-1]='\0';
    _tcscat(pBuf,"\\Media\\Windows 登录音.wav"); 
    // StrTrim(pBuf,_T("system32"));      //这个需要:Shlwapi.h
    CString cs=_T( "已上网");
    //GetDlgItem(IDC_ISONLINE)->
    SetDlgItemText(IDC_ISONLINE, cs);
    sndPlaySound(pBuf,SND_SYNC);
    }
    else GetDlgItem(IDC_TESTALT)->SetWindowText(_T("未上网"));
    }
    //下面这段是MSDN的如何设置代理服务器信息
    The following sample demonstrates how to set proxy information for a LAN connection.BOOL SetConnectionOptions()
    {
        INTERNET_PER_CONN_OPTION_LIST list;
        BOOL    bReturn;
        DWORD   dwBufSize = sizeof(list);    // Fill out list struct.
        list.dwSize = sizeof(list);    // NULL == LAN, otherwise connectoid name.
        list.pszConnection = NULL;    // Set three options.
        list.dwOptionCount = 3;
        list.pOptions = new INTERNET_PER_CONN_OPTION[3];    // Make sure the memory was allocated.
        if(NULL == list.pOptions)
        {
            // Return FALSE if the memory wasn't allocated.
            return FALSE;
        }    // Set flags.
        list.pOptions[0].dwOption = INTERNET_PER_CONN_FLAGS;
        list.pOptions[0].Value.dwValue = PROXY_TYPE_DIRECT |
            PROXY_TYPE_PROXY;    // Set proxy name.
        list.pOptions[1].dwOption = INTERNET_PER_CONN_PROXY_SERVER;
        list.pOptions[1].Value.pszValue = "http://proxy:80";    // Set proxy override.
        list.pOptions[2].dwOption = INTERNET_PER_CONN_PROXY_BYPASS;
        list.pOptions[2].Value.pszValue = "local";    // Set the options on the connection.
        bReturn = InternetSetOption(NULL,
            INTERNET_OPTION_PER_CONNECTION_OPTION, &list, dwBufSize);    // Free the allocated memory.
        delete [] list.pOptions;    return bReturn;
    }
      

  4.   

    怎么不用Netbois呢
    发送netbois命令就可以了
    看看msdn就知道了
      

  5.   

    哪你只能判断本机的Internal 的设置。
      

  6.   

    转自驱动开发网
    发信人: rain (夜猫子大王), 信区: SysInternals
    标 题: Re: 请问实时发现网络down掉的原理?(转载)
    发信站: 武汉白云黄鹤站 (2001年03月31日09:57:05 星期六), 转信实时检测网线被拔掉是需要网卡设备驱动程序支持的,
    如果驱动程序不支持是无法实现的,NDIS4要求设备驱动程序
    最好提供CheckForHangHandler回调函数。2000会每隔2秒钟
    调用此函数。驱动程序在此函数中检查网卡连线状态,
    如果发生了改变,即拔去了网线或接上了网线,
    驱动程序就会调用NdisMIndicateStatus通知所有的上层NDIS协议驱动程序.
    其中: NDIS_STATUS_MEDIA_DISCONNECT 指示网线被拔掉,
    NDIS_STATUS_MEDIA_CONNECT 指示网线被接上
    NDIS_STATUS_LINK_SPEED_CHANGE 指示网卡速度改变,10/100自适应网卡才有。
    网卡一般都有 status register 指示当然的连线状态,
    也有网卡是通过获得 led status 来知道当前的连线状态的,
    即绿灯亮表示连线,灭表示没有。
    有些网卡拔掉或接上网线时会产生中断,在中断处理程序中一般也
    检测网络连线状态并调用NdisMIndicateStatus,这样连线状态
    在2000中就实时反应出来了,否则会在2秒钟内,即NDIS调用CheckForHangHandler后。这个功能是微软在PC97规范中定义的,所以ndis3没有这个功能。
    linux对这个没有要求,novell netware对这个有要求,其它的操作系统我也不清楚。