网络连接上之后一般都会保存一个fd,相当一个设备描述符,socket在connect()后会有这个,我用的是CSocket类,开始没找个这个东西,后来才发现,这是一个int类型的变量,最后才发现名字叫m_hSocket,我的目的的要写一个心跳维护程序,在判断有无东西可接就行,如果没有东西可接说明网络连接有问题,5秒钟后跳出.
下面的简单的程序:
UINT _KeepHeartLiving(LPVOID lparam)
{
AlarmScan alarmDlg;
HeartLiving keepLiving;
livingAckMsg heartAck;
// int send,recv;
int num = 0;
int sock = 0;
keepLiving.comType = 0x7;
keepLiving.subComType = 0x1;
alarmDlg.InitSocket();
sock = alarmDlg.sockClient.m_hSocket;
/*add */
memset(&heartAck,0,sizeof(heartAck));
fd_set set;
timeval tm;
int error;
int len;
len = sizeof(int);
int ret=0;
tm.tv_sec = 1;
tm.tv_usec = 0; //1 sec == 100 0000 usec //设置接收消息超时时长
FD_ZERO(&set);
FD_SET(sock, &set);
while(1)
{
alarmDlg.sockClient.Send((char*)&keepLiving,sizeof(HeartLiving));
if( select(sock+1, &set, NULL, NULL, &tm) > 0)
{
getsockopt(sock, SOL_SOCKET, SO_ERROR, (char *)&error, &len);
if(error != 0)
{
//ret = 0;
ret++;
if(ret == 5)
{
break;
}
continue;
}
else
{ //有东西可读
// int recvlen=recv(sock,buf,8192,0);
alarmDlg.sockClient.Receive((char*)&heartAck,sizeof(livingAckMsg));
if((heartAck.msgType == 0x7) && (heartAck.subMsgType == 0x1))
{
Sleep(1000);
}
}
}
}
return 0;
}
基本就是这么一个过程.