windows 下select方法读取socket

网络连接上之后一般都会保存一个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;

}

 

基本就是这么一个过程.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值