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 跳线程

转载于:https://www.cnblogs.com/butterflybay/p/10347927.html

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

  1. JAVA ANDROID SOCKET通信检测(SERVER)连接是否断开

    Pre 解决思路 代码后记: 客户端app上的部分代码 调用: 服务器上: 客户端判断服务器是否还活着代码: PRE 在利用socket写通讯程序的时候,想检测服务器是否还活着. 从网上找了很多资料, ...

  2. VMware ESXi客户端连接控制台时提示“VMRC控制台连接已断开...正在尝试重新连接“的解决方法

    VMware ESXi客户端连接控制台时提示"VMRC控制台连接已断开...正在尝试重新连接"的解决方法 参考文章: (1)VMware ESXi客户端连接控制台时提示" ...

  3. C#socket通信时,怎样判断socket双方是否断开连接

    我在Server端new了一个socket,然后bind,开了一个线程来accept前来连接的client,每接到一个client前来连接就新开一个线程和它进行通信. 我把Server端得到的sock ...

  4. 解决socket通信时TIME_WAIT的socket过多

    TIME_WAIT状态 TCP要保证在所有可能的情况下使得所有的数据都能够正确被投递. 当关闭一个 socket 连接时,主动关闭一端的 socket 将进入TIME_WAIT状态,而被动关闭一方则转 ...

  5. 浅谈PLC通信中的TCPIP的连接和断开

    在PLC通信中,TCP/IP是大家普遍选择的协议,因为它是开放的以太网协议,不仅仅在西门子内部的设备之间可以使用,也可以在与第三方的设备之间进行广泛的通信.其中原因还包含TCP/IP是面向连接的,可靠 ...

  6. C++多线程编程以及epoll处理socket通信时多端口问题

    问题根源:当有许多客户端用socket来连接我的服务器(期间存在一定的数据交互)的时候,为了提高性能,我们需要采用多线程编程(处理具体的请求),同时还要使用epoll来高效的在IO事件之间切换(侦查s ...

  7. Linux下TCP通信时一方主动关闭连接时TCP给应用层的反馈

    内核的TCP程序会进行四次挥手关闭连接,如果应用层正在读取数据: ①.如果数据没有读完,会继续读取缓冲区的数据: ②.如果读完了,在读的话读函数返回0,表示EOF,TCP连接关闭,读到了socket文 ...

  8. 笔记本电脑同时连接有线网络和无线网络时,如何判断实际连接的网络

    1. 看路由表: route print,有多个连接的时候比较metric,数值小的优先. 2. Wired and Wireless connections on the same Windows ...

  9. Qt使用socket通信时接收的汉字信息显示时乱码

    显示乱码的原因是因为编码格式不一致. 下面附上一个曾经的例子. QString str = ui->textEdit->toPlainText();QByteArray text = st ...

最新文章

  1. SemSegMap :基于3D点云语义信息的定位
  2. shiro教程(3)-shiro授权
  3. Boost:BOOST_ASSERT_IS_VOID的测试程序
  4. 你发这些什么目的_吸引女生冷知识:朋友圈发照片的“潜规则”,男生要懂
  5. html下拉列表用ul,Vue.js做select下拉列表的实例(ul-li标签仿select标签)
  6. Cloud Foundry Session Affinity(Sticky Session)的实现
  7. ComboBox联动
  8. 树莓派使用STEP4:安装vim
  9. CENTOS 7 踢用户_CentOS服务器及MySQL数据库性能测试-乐搏软件测试
  10. TS Interface(接口)
  11. Python定时任务轻量解决方案---Schedule
  12. pytorch nn.LogSoftmax
  13. 谈360下拉词360下拉框的优势及360搜索推广方法有哪些?
  14. shiro权限架作战
  15. 能“干掉”苹果的中国“黑客”
  16. Python可视化配色方案,分分钟实现配色自由啦~
  17. 华为设备IGMP配置命令
  18. Flutter: 弹性布局Flex(Expanded)、流式布局Wrap、Flow
  19. 遇见2016年最值得期待的新产品
  20. 如何设计可视化搭建平台的组件商店?

热门文章

  1. 遇java.lang.OutOfMemoryError: PermGen space之解决方案
  2. Python中使用librosa包进行mfcc特征参数提取
  3. 基于Springboot实现企业人事管理系统
  4. 基于Javaweb实现企业财务管理系统
  5. ERROR: Could not install packages due to an EnvironmentError: [WinError 5] 拒绝访问
  6. Windows中几个内存相当的指标
  7. 什么是 WMI?From MSDN
  8. 对不队—— Alpha冲刺
  9. 201521123111《Java程序设计》第2周学习总结
  10. SQL Server 数据库的维护(一)__存储过程(procedure)