socket通信时如何判断当前连接是否断开--select函数,心跳线程,QsocketNotifier监控socket

 

client与server建立socket连接之后,如果突然关闭server,此时,如果不在客户端close(socket_fd),会有不好的影响: 

 

 

QsocketNotifier监控socket的槽函数不断地被执行!!这是为什么呢!服务器既然已经关了,为什么socketNotifier认为还会有数据出现?

 

 

原因不知道,需要继续探索!但是,避免上述情况的方法是在客户端检测连接是否还是通着的,如果不通了,直接close,然后QsocketNotifier监控socket的槽函数就不会不断地被出发了!如下面例子:

int ReceiveData(int ms,unsigned char* buffer, unsigned int bufferLen)
{
    std::string ret;
    // waitingTime
    struct timeval tval;
    tval.tv_sec = ms / 1000;
    tval.tv_usec = (ms % 1000) * 1000;
    // flags
    fd_set fdSet;//声明了一个文件描述符集fdSet. fd_set是以位图的形式来存储各个文件描述符
    FD_ZERO(&fdSet);//将一个 fd_set类型变量的所有位都设为 0
    FD_SET(Socket, &fdSet);//将fdSet变量的某个位 置位
    // check
//mSocket + 1:集合中所有文件描述符的范围,即所有文件描述符的最大值加1
//select函数的第二个入参:对应的是需要被读取的文件集合。判断是否可以从这些文件中读取数据了,如果这个集合中有一个文件可读,select就会返回一个大于0的值,表示有文件可读;
//如果没有可读的文件,则根据timeout参数再判断是否超时,若超出timeout的时间,select返回0,若发生错误返回负值。可以传入NULL值,表示不关心任何文件的读变化。

    if (::select(Socket + 1, &fdSet, NULL, NULL, &tval) <= 0)//使用select()函数测试一个socket是否可读;
    {
        return -1;
    }
    int size = static_cast<int>(::recv(Socket, buffer, bufferLen, 0));
   
    if (size <= 0)
    {
        Close();
        return -1;
    }
    return size;
}

linux select函数介绍
https://www.cnblogs.com/ccsccs/articles/4224253.html

在Beginning Linux Programming book中在介绍socket的那一章节中提到了linux 的select函数,很好的介绍,后面把他记录在这里。

 

好文章:

TCP socket如何判断连接断开:  https://www.cnblogs.com/feng9exe/p/7610454.html

概念TCP通信客户端Socket 跳线程

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

First Snowflakes

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值