1123 检查主机在线的代码

来源:互联网 发布:软件开发 招标网站 编辑:程序博客网 时间:2024/05/17 04:46

 BOOL CheckHostStatus(CString &strIPAddr)
{
 char destip[20] ;
 sprintf(destip,"%s",strIPAddr.GetBuffer(strIPAddr.GetLength()));
 
 //定义变量
 SOCKET           m_hSocket;
 SOCKADDR_IN      m_addrDest;
 SOCKADDR_IN      m_addrFrom;
 char             *icmp_data;
    char             *recvbuf;
 USHORT           seq_no ;
 char             *lpdest;
 int              datasize;
 BOOL    m_bRecordRout;
 int              timeout;
    int              recvicmpnum;
 int     ret = 0;

 //初始化变量
 icmp_data     = NULL;
 seq_no        = 0;
 recvbuf       = NULL;
 m_bRecordRout = FALSE;
 lpdest        = NULL;
 datasize      = DEF_PACKET_SIZE;
 m_hSocket     = INVALID_SOCKET;
    recvicmpnum   = 0;

 //初始化套接字
 WSADATA wsaData;
 if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
    {
        return 0;
    }

 m_bRecordRout = FALSE;
 lpdest = destip;

    m_hSocket = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);

    if (m_hSocket == INVALID_SOCKET)
    {
        return FALSE ;
    }

    timeout = 100;
 ret = setsockopt(m_hSocket, SOL_SOCKET, SO_RCVTIMEO,
                (char*)&timeout, sizeof(timeout));

    if(ret == SOCKET_ERROR)
    {
  if (m_hSocket != INVALID_SOCKET) {
   closesocket(m_hSocket);
  }
        return FALSE;
    }
   
    ret = setsockopt(m_hSocket, SOL_SOCKET, SO_SNDTIMEO,
                (char*)&timeout, sizeof(timeout));

    if (ret == SOCKET_ERROR)
    {
  if (m_hSocket != INVALID_SOCKET) {
   closesocket(m_hSocket);
  }
        return FALSE;
    }

    memset(&m_addrDest, 0, sizeof(m_addrDest));

 m_addrDest.sin_family = AF_INET;
   
 if ((m_addrDest.sin_addr.s_addr = inet_addr(lpdest)) == INADDR_NONE)
    {  
  if (m_hSocket != INVALID_SOCKET) {
   closesocket(m_hSocket);
  }
        return FALSE;
    }  

    //
    // Create the ICMP packet
    //
    datasize += sizeof(IcmpHeader); 

    icmp_data =(char*) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,MAX_PACKET);
    if (!icmp_data)
    {
  if (m_hSocket != INVALID_SOCKET) {
   closesocket(m_hSocket);
  }
        return FALSE;
    }

    recvbuf   =(char*) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,MAX_PACKET);
    if (!recvbuf)
    {
  if (m_hSocket != INVALID_SOCKET) {
   closesocket(m_hSocket);
  }
        return FALSE;
    }

    memset(icmp_data,0,MAX_PACKET);

 //重要函数,填充ICMP包头
    FillICMPData(icmp_data,datasize);

    ((IcmpHeader*)icmp_data)->i_cksum = 0;
    ((IcmpHeader*)icmp_data)->timestamp = GetTickCount();
    ((IcmpHeader*)icmp_data)->i_seq = seq_no++;
    ((IcmpHeader*)icmp_data)->i_cksum = CheckSum((USHORT*)icmp_data, datasize);
  
 DWORD time=GetTickCount();
    ret = sendto(m_hSocket, icmp_data, datasize, 0,
                     (struct sockaddr*)&m_addrDest, sizeof(m_addrDest));

    if (ret == SOCKET_ERROR)
    {
  if (m_hSocket != INVALID_SOCKET) {
   closesocket(m_hSocket);
  }
  HeapFree(GetProcessHeap(), 0, recvbuf  );
  HeapFree(GetProcessHeap(), 0, icmp_data);
  WSACleanup();

        return FALSE;
 }

 int fromlen = sizeof(m_addrFrom);
    time= GetTickCount();
 ret = recvfrom(m_hSocket, recvbuf, MAX_PACKET, 0,
                (struct sockaddr*)&m_addrFrom, &fromlen);
       
 if (ret == SOCKET_ERROR)
    {
  if (m_hSocket != INVALID_SOCKET) {
   closesocket(m_hSocket);
  }
  HeapFree(GetProcessHeap(), 0, recvbuf  );
  HeapFree(GetProcessHeap(), 0, icmp_data);
  WSACleanup();

        return FALSE;
    }

 if (m_hSocket != INVALID_SOCKET) {
        closesocket(m_hSocket);
 }
    HeapFree(GetProcessHeap(), 0, recvbuf  );
    HeapFree(GetProcessHeap(), 0, icmp_data);

 return TRUE;
}