谁能发个最简单的心跳包程序看看 谁能发个最简单的心跳包程序看看,尽可能简单吧,比如说不提供设置心跳频率,直接写死,这样就不用花时间花脑筋去分析设置心跳频率的代码。谢谢。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 如果是TCP的话,可以直接使用TCP的KeepAlive KeepAlive,据说不太合适,据说影响内核对象什么的, 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;} 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呢? 停靠在同一行上的toolbar的位置调整问题 to: echoxue(虎子) 创建快捷方式问题,怎样创建一个拨号的快捷方式 请问用vc.net,调用web service,收到的是一个xml格式的dataset,我想得到里面的数据,请问该怎么搞? GetProcAddress函数使用问题 看书不太懂,虚拟内存的问题 怎么没人理我 现在的CSDN太花了,我都不知道看什么了......... 有没有石家庄的vc程序员,我打算与人一起创业 APIHOOK的问题 关于POINT 和RECT 转换的问题 讨论下使用RegisertWindowMessage进行程序间的通信问题?
如果是TCP的话,可以直接使用TCP的KeepAlive
{
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;
}
{
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呢?