通过SOCKET检测TCP网络连接。我用过getpeername(),但这只对正常连接中断时有效,但对于硬件连接中断没有效果。
我想用ping但,但怕增大网络流量。还有没有其它办法呢??

解决方案 »

  1.   

    tlhelp32.h和iphlpapi.lib,能检测出当前的TCP/IP连接状态和连接表。
    也就是netstat.exe
    1。取得TCP连接表函数:::GetTcpTable();
    2.取得UPD监听者表函数:::GetUdpTable();
    3.取得IP协议统计情况函数:::GetIpStatistics();
      

  2.   

    硬件连接中断几乎没法检查出来.最简单的办法就是在TCP连接上周期发送检测包
      

  3.   

    这是我的一段检测程序,用在自定义的一个线程中,请讨论一下:DWORD WINAPI CSetSocket::CheckConThread(LPVOID lParam)
    {
    CSetSocket *pss = (CSetSocket *)lParam; fd_set fs;
    TIMEVAL tm;
    int nRet, nLen = 32;
    char lpRecv[32]; while(pss->m_bCheckCon)
    {
    fs.fd_count = 1;
    fs.fd_array[0] = pss->m_Socket;
    tm.tv_sec = 0;
    tm.tv_usec = 300;
    nRet = select(0, &fs, NULL, NULL, &tm);
    if(0 == nRet) //time out
    {
    continue;
    }else if(1 == nRet)
    {
    Sleep(50);
    nRet = recv(pss->m_Socket, lpRecv, 32, 0);
    if(0 == nRet)
    //if(!pss->RecvData(lpRecv, &nLen))
    {
    //call the callback function for the completetion of the connection
    if(pss->m_pCallBack)
    {
    pss->m_pCallBack();
    }
    pss->m_bConnected = FALSE;
    pss->m_bCheckCon = FALSE;
    pss->m_hCheckThread = NULL; break;
    }else{
    continue;
    }
    }else if(SOCKET_ERROR == nRet)
    {
    break;
    } } return 0;
    }
      

  4.   

    转自驱动开发网
    发信人: 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对这个有要求,其它的操作系统我也不清楚。
      

  5.   

    MSN做得很好的啊
    他是怎么搞得?