谁能发个最简单的心跳包程序看看,尽可能简单吧,比如说不提供设置心跳频率,直接写死,这样就不用花时间花脑筋去分析设置心跳频率的代码。谢谢。

解决方案 »

  1.   


    如果是TCP的话,可以直接使用TCP的KeepAlive
      

  2.   

    KeepAlive,据说不太合适,据说影响内核对象什么的,
      

  3.   

    DWORD WINAPI CVirtualDevice::MSGSendThread(LPVOID lpParam)
    {
    CVirtualDevice * p_unit = (CVirtualDevice * )lpParam;
    DWORD dwTimeOut = THROB_TIME_OUT; // 每五秒钟发送一次消息
    UINT msg_id;
    void *pData = NULL;
    CManagementMessage *umsg; while (!p_unit->m_ThreadExit)
    {
    if (p_unit->m_msgQueue->getMessage(msg_id, pData,dwTimeOut)) 
    {
    switch(msg_id) 
    {
    case WM_INFO_OK:
    if (pData != NULL) {
    umsg = (CManagementMessage *)pData;
    /*
    * discard early msg because we have encouter problem now
    * to ensure we don't eat infinite memory
    */
    if (p_unit->m_msgQueue->messageCount() >= 32) {
    delete umsg;
    break;
    }
    p_unit->SendMsg(umsg);
    /*
    * sleep some time for device happy
    */
    //int msg_type = umsg->getMessageType();
    //if (msg_type == CMD_CAT_BMP || msg_type == CMD_RMQ)
    // Sleep(2000);
    //else
    // Sleep(800);
    delete umsg;
    }
    break;
    case WM_UNIT_QUIT:
    // 收到退出命令,退出消息
    p_unit->m_ThreadExit = true;
    break;
    default:
    break;
    }
    }
    else { // 等待超时,发送心跳消息
    p_unit->SendMsg(m_alive_check_msg);
    }
    ::Sleep(8);
    }
    TRACE("[%s]: send thread quit.\n", p_unit->GetName());
    return 0;
    }
      

  4.   

    void CMFTcpSrvTestDlg::StartSocket()
    {
    WSADATA wsaData;
    int err;

    err = WSAStartup(0x101,&wsaData);
    if (err  != 0)
    {
    ::MessageBox(NULL,_T("WSAStartup Error"),_T("WSAStartup Error"),MB_OK);
    return ;
    }
    if (LOBYTE (wsaData.wVersion)!= 1 || HIBYTE (wsaData.wVersion)!= 1 )
    {
    ::MessageBox(NULL,_T("wsaversion error"),_T("WSAStartup Error"),MB_OK);
    WSACleanup();
    return;
    }
    SOCKET m_sockSrv = socket(AF_INET,SOCK_STREAM,0);
    SOCKADDR_IN addrSrv;
    addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    addrSrv.sin_family = AF_INET;
    addrSrv.sin_port = htons(6122);
    bind (m_sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
    if(listen(m_sockSrv,5) == SOCKET_ERROR)
    {
    ::MessageBox(NULL,_T("listen fail"),_T(""),MB_OK);
    return ;
    }

    }void CMFTcpSrvTestDlg::OnBnClickedButton1()
    {

    /*listen(m_sockSrv,5);*/
    SOCKADDR_IN addrClient;
    int len = sizeof (SOCKADDR);
    SOCKET sockConn = accept(m_sockSrv,(SOCKADDR*)&addrClient,&len);
    if(sockConn == INVALID_SOCKET)
    {
    ::MessageBox(NULL,_T("accept fail"),_T(""),MB_OK);
    return;

    }

    char recvBuf[100];
    recv (sockConn,recvBuf,100,0);
    SetDlgItemText(IDC_EDIT1,CString(recvBuf));
    closesocket(sockConn);
    return ;
    }现在为什么老报ACCEPT FAIL呢?