如果不主动关闭socket的话,系统不会自动关闭的,除非当前进程挂掉了,操作系统把占用的socket回收了才会关闭。小编今天跟大家简单介绍下如何在C语言中判断socket是否已经断开

下面来介绍判断非阻塞SOCKET是否已经断开的几种方法:

注意要区分不同操作系统分别进行测试, 包括WINDOWS, LINUX和UNIX会各有不同。

在WINDOWS下比较简单,可以使用FD_CLOSE事件判断SOCKET是否已经断开

view plaincopy to clipboardprint?

bool IsSocketClosed(SOCKET clientSocket)

{

bool ret = false;

HANDLE closeEvent = WSACreateEvent();

WSAEventSelect(clientSocket, closeEvent, FD_CLOSE);

DWORD dwRet = WaitForSingleObject(closeEvent, 0);

if(dwRet == WSA_WAIT_EVENT_0)

ret = true;

else if(dwRet == WSA_WAIT_TIMEOUT)

ret = false;

WSACloseEvent(closeEvent);

return ret;

}

在UNIX/LINUX下,非阻塞模式SOCKET可以采用recv+MSG_PEEK的方式进行判断,其中MSG_PEEK保证了仅仅进行状态判断,而不影响数据接收

对于主动关闭的SOCKET, recv返回-1,而且errno被置为9(#define EBADF   9 /* Bad file number */)

或104 (#define ECONNRESET 104 /* Connection reset by peer */)

对于被动关闭的SOCKET,recv返回0,而且errno被置为11(#define EWOULDBLOCK EAGAIN /* Operation would block */)

对正常的SOCKET, 如果有接收数据,则返回>0, 否则返回-1,而且errno被置为11(#define EWOULDBLOCK EAGAIN /* Operation would block */)

因此对于简单的状态判断(不过多考虑异常情况),

recv返回>0,   正常

返回-1,而且errno被置为11  正常

其它情况    关闭

view plaincopy to clipboardprint?

#include

bool IsSocketClosed(int clientSocket)

{

char buff[32];

int recvBytes = recv(clientSocket, buff, sizeof(buff), MSG_PEEK);

int sockErr = errno;

//cout << "In close function, recv " << recvBytes << " bytes, err " << sockErr << endl;

if( recvBytes > 0) //Get data

return false;

if( (recvBytes == -1) && (sockErr == EWOULDBLOCK) ) //No receive data

return false;

return true;

}

此外,所有操作系统上还可以通过TCP_KEEPLIVE实行心跳检测。

以上就是本文的全部内容,希望对大家的学习有所帮助,

linux检查socekt是否断开,如何在C语言中判断socket是否已经断开相关推荐

  1. python判断字符串相等_如何在python语言中判断两个变量或字符串相等

    在python语言中,判断两个变量是否相等或一致,除了使用==之外,还是可以使用is来判断.is和==作用是一致的,但是还有个判断不一致,就是使用is not.下面利用几个实例说明==和is的区别,操 ...

  2. c语言if中文字符串比较好,如何在C语言中使用汉字作为if的判断语句?

    题目: 如何在C语言中使用汉字作为if的判断语句? 解答: 直观点可以用strcmp函数,如果想用直接用==或!=来判断,你要先把汉字换成一个unsigned short型,要比较的汉字也放入一个un ...

  3. 在linux下,如何在C语言中使用正则表达式

    http://hi.baidu.com/d_south/blog/item/9d22a34b1fc2bcf483025c53.html 在linux下,如何在C语言中使用正则表达式(整理) 2008- ...

  4. 怎样设置一个函数C语言,C语言中怎样编写一个函数 如何在C语言中定义一个函数?...

    如何在C语言中定义一个函数?小编很想在你面前流泪最后却还是选择装作打个哈欠 为什么小编怎么定义函数都不正确呢? 总是说小编 表达语法错误在main函数中 小编们可以在头文件与main函数之间定义,并编 ...

  5. c语言如何输入数字,请问如何在C语言中输入数字获得拼音?

    请问如何在C语言中输入数字获得拼音? 答案:1  信息版本:手机版 解决时间 2018-12-10 16:41 已解决 2018-12-10 08:20 请问如何在C语言中输入数字获得拼音? 最佳答案 ...

  6. c语言编程输出字母倒三角形,如何在C语言中打印倒三角形

    如何在C语言中打印倒三角形 发布时间:2020-07-28 11:53:15 来源:亿速云 阅读:281 作者:Leah 这期内容当中小编将会给大家带来有关如何在C语言中打印倒三角形,文章内容丰富且以 ...

  7. c语言 引用定义变量,如何在c语言中定义及引用全局变量?

    如何在c语言中定义及引用全局变量? 答案:5  信息版本:手机版 解决时间 2019-10-03 10:30 已解决 2019-10-02 15:19 如何在c语言中定义及引用全局变量? 最佳答案 2 ...

  8. 如何在R语言中建立六边形矩阵热图heatmap可视化

    原文链接:http://tecdat.cn/?p=18879 这是一个六边形热图可视化程序,主要用到的知识RColorBrewer,fields,也就是R中的可视化绘图库(点击文末"阅读原文 ...

  9. 如何在C语言中实现某个数的n次方

    问题:如何在C语言中实现某个数的n次方 #include <math.h>            //  pow函数是在math.h头文件中的,用的时候要包含到头文件 pwd(a,n);  ...

最新文章

  1. js 加入debug后可以进入controller_新手入门Nest.js(四) 控制器路由
  2. 微信开发七(配置js-SDK,步骤2)
  3. 19.内在摄像机校准——内联函数 测验,结合外在和内在校准参数,编写相同方程的其他方法,相机参数_2
  4. 【报告分享】2022年元宇宙全球年度(202页干货):蓄积的力量-北京大学.pdf(附下载链接)...
  5. ArcGIS API for Silverlight/WPF/Windows Phone/Android 插件下载地址
  6. android打造一个简单的欢迎界面
  7. linux 路由表及路由设置
  8. ubuntu 20.04 pdf viewer 推荐
  9. Android -- WiFi的NUD检测机制浅析
  10. 华为的人才体系:任正非这样管理19万员工
  11. veeam 备份文件服务器,如何用veeam给windows服务器做备份?
  12. 计算机切换用户屏幕闪,小编教您Win10切换用户后闪屏的具体办法
  13. 鲸探发布点评:8月19日发售《小窗白云与凿山骨》数字藏品
  14. YOLOv5+TensorRT+Win11(Python版)
  15. 大白菜装机版一键制作启动u盘教程
  16. 锂电池放空后充不进电_锂电池充不进去电怎么办(锂电池为什么小偷不要)
  17. 随机森林算法(Random Forest)R语言实现
  18. Java技能点--基本类型与非基本类型
  19. tmux还有这种操作,我在这边的窗口上操作,你那边可以实时的看到我的操作,厉害了...
  20. HTML+CSS 土豆网鼠标经过显示遮罩

热门文章

  1. 更改MySQL数据库目录位置
  2. python 学习笔记 运算符优先级(8)
  3. linux应用程序安装与管理
  4. 盐为什么能使冰熔化得更快
  5. anaconda切换python版本及对应环境,太方便
  6. 2020-08-23 W7电脑锁屏后,能让电脑处于运行状态吗?
  7. 中国开发者新福利:大模型API接口出炉,让普通用户玩转内容生成
  8. 马腾宇的AI学术历程:做科研要考虑长期的影响力
  9. 智源神经元识别挑战赛发布:收获不只是10万元奖金
  10. 图灵2月书讯:书籍,不可分离的生命伴侣