UINT CCommSrv::ThreadUpdateHostStatus(LPVOID param)
{
CCommSrv* pCommSrv = (CCommSrv*)param; const int DELAYTIME = 200; //300毫秒更新一次主机信息
const int SENDTIMES = 3;
const int DEADLIMIT = 20;
char pszHostName[NAME_MAX_LEN];
UINT nPort = 0;

int i = 0;
HOST* pHost = NULL;
for (i=0;i<HOST_MAX;i++)
{
pHost = realdb_GetHost(i);
ASSERT (pHost != NULL); if (strlen(pHost->m_pszName ) == 0)
break;
else if (stricmp(pHost->m_pszName,pCommSrv->m_pszLocalHostName) == 0)
{
//如果是本机,设定本机的运行状态为正在运行
pHost->m_nStatus = HS_RUNNING;
}
else
{
/*
如果是其它主控机,先将其状态设置为停机状态,如果随后接收到
它的平安报文,会自动把它设置成运行状态
*/

if (pHost->m_nDeadCount >= DEADLIMIT && pHost->m_nStatus != HS_STOPPED)
{
pHost->m_nStatus = HS_STOPPED;
pHost->m_nDeadCount = DEADLIMIT;
TRACE ("网络监控Message: 机器%s由开机->停机\n",pHost->m_pszName);
}

pHost->m_nDeadCount++;

//把自己的主机名称发送到每个主控机,作为平安报文
for (int j=0;j<SENDTIMES;j++)
{
pCommSrv->m_nspSocket.SendTo(pCommSrv->m_pszLocalHostName,
strlen(pCommSrv->m_pszLocalHostName),
NSP_PORT,
pHost->m_pszIPAddress);
Sleep (5);
}
}
} CString strIPAddr;
int nRXCount = 0;
while (TRUE)
{
memset (pszHostName,0,NAME_MAX_LEN);
nRXCount = pCommSrv->m_nspSocket.ReceiveFrom(pszHostName,NAME_MAX_LEN,
strIPAddr,nPort);
if (nRXCount > 0)
{
//如果接收到平安报文,就要更新实时库中的主机状态
pHost = realdb_GetHostByName(pszHostName);
if (pHost != NULL && pHost->m_nStatus != HS_RUNNING)
{
TRACE ("网络监控Message: 机器%s由停机->开机\n",pszHostName);
pHost->m_nStatus = HS_RUNNING;
pHost->m_nDeadCount = 0;
}
}
else if (nRXCount < 0)
{
DWORD dwRet = GetLastError();
//pCommSrv->m_nspSocket.Close ();
//pCommSrv->m_nspSocket.Create (NSP_PORT,SOCK_DGRAM);
break;
}
else
break;
}
Sleep (DELAYTIME); return TRUE;
}
简单谈一下我的思路,我的程序需要做双机热备,这个程序要在每一台机器上运行,负责和接收发送平安报文,这样每台机器都需要知道其他机器的状态,我使用udp方式,如果隔一定的时间没有受到其他机器的平安报文,就认为那台机器死掉了。现在的问题,如果备用服务器先启动,主服务器后启动,应该出现备用服务器停止,主服务器运行,但是情况是备用服务器不能检测到主服务器启动了没有,但是主服务器检测到备用服务器启动了。也就是说我的程序有毛病,有时候不能受到平安报文。还有,如果已经收到平安报文,我把发送平安报文的机器网线拔掉,还可以收到这台机器发送的平安报文,这个就搞不懂了。期待高手指教!在线等待,马上结帐,谢谢