bConnect = ???;
主要的是快,不要检测那么久.
应该一个 API 就可以了吗?谢了.

解决方案 »

  1.   

    可以用netstat的方法好像iphelp aip里面可以做到这些的.
      

  2.   

    SetSockOpt()函数,其中设置nOptionName为SO_KEEPALIVE,lpOptionValue为true,然后当你想确认你是否还保持和另一主机的连接,那么调用getsockopt()
      

  3.   

    连接一下了。
    if (connect(dlg->client,(struct sockaddr *)&(dlg->addr),sizeof(dlg->addr)))


    AfxMessageBox("fail.");
    closesocket(dlg->client);
    return -1;
    }
      

  4.   

    j检测TCP的连接,利用半开扫描看看行码,我没做过的。
      

  5.   

    用原始套接字实现,发送SYN请求,收到ACK后立即断开连接,非常快速,且不容易被发现:)
      

  6.   

    用netbios就可以
    发送一个命令就可以了
    netboi
      

  7.   

    nbstat应该可以,并且的得到目的主机的网卡地址,主机名等等
      

  8.   

    试试这个函数
    IsDestinationReachable
      

  9.   

    GetTcpTableDWORD GetTcpTable(
      PMIB_TCPTABLE pTcpTable,  // buffer for the connection table
      PDWORD pdwSize,           // size of the buffer
      BOOL bOrder               // sort the table?
    );
      

  10.   

    在程序里定时PING一下就行,看是否与另一电脑保持连接
    如果你是C/S结构的发心跳连接也行,看是否与另一程序保持连接
      

  11.   

    最简单的办法就是定时查询
    下面是关键的代码:
    typedef BOOL (CALLBACK *ISNETWORKALIVE)(LPDWORD lpdwFlags);
    #define NETWORK_ALIVE_LAN 0x00000001
    #define NETWORK_ALIVE_WAN 0x00000002
    #define NETWORK_ALIVE_AOL 0x00000004
    class CAutoLoadDll
    {
    public:
    CAutoLoadDll(const char * szDllname)
    {
    hinstLib = LoadLibrary(szDllname);
    }
    ~CAutoLoadDll()
    {
    if(hinstLib)
    FreeLibrary(hinstLib);
    }
    FARPROC GetProcAddress(const char * szProcname)
    {
    if(hinstLib)
    return ::GetProcAddress(hinstLib,szProcname); 
    else
    return NULL;
    }
    public:
    HINSTANCE hinstLib;     
    };
    class CTestDlg : public CDialog
    {
    ...
    CAutoLoadDll m_Sensapi;
    ISNETWORKALIVE m_pfnIsNetworkAlive;
    }
    CTestDlg::CTestDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CTestDlg::IDD, pParent),m_Sensapi("sensapi.dll")
    {
    m_pfnIsNetworkAlive = (ISNETWORKALIVE)m_Sensapi.GetProcAddress("IsNetworkAlive");
    ...
    }BOOL CTestDlg::OnInitDialog()
    {
    ...
    SetTimer(1,500,NULL);
    ...
    }void CTestDlg::OnTimer(UINT nIDEvent) 
    {
    if(nIDEvent == 1 && m_pfnIsNetworkAlive)
    {
    DWORD dwFlag = 0;
    if(m_pfnIsNetworkAlive(&dwFlag))
    {
    if((dwFlag&NETWORK_ALIVE_WAN)&&(dwFlag&NETWORK_ALIVE_LAN))
    SetWindowText("存在LAN和WAN");
    else if(dwFlag&NETWORK_ALIVE_LAN)
    SetWindowText("存在LAN");
    else if(dwFlag&NETWORK_ALIVE_WAN)
    SetWindowText("存在WAN");
    else
    SetWindowText("没有网络");
    }
    else
    {
    SetWindowText("没有网络");
    }
    }
    CDialog::OnTimer(nIDEvent);
    }
    这样做的缺点就是反应不够即时,只有当系统收到至少一个数据包后才能加以判断.再要不就是实现ISensNetwork
      

  12.   

    gethostbyname或gethostbyaddr的返回值应该可以得到是否连通