Linux ioctl FIONREAD 和select 使用

Linux ioctl FIONREAD 和select 使用LinuxioctlFIONREAD和select使用使用select与ioctl判断socketclient是否断开的方式(1)ioctl+FIONREADintnsel=select(maxfd+1,&(rfds),NULL,NULL,&timeout);if(-1!=ioctl(clientfd,FIONREAD,&nread)){if(nread!=0){result=readable;}else{resul

大家好,又见面了,我是你们的朋友全栈君。

Linux ioctl FIONREAD 和select 使用

使用select 与ioctl判断socket client是否断开的方式
(1)ioctl + FIONREAD
int nsel = select(maxfd+1, &(rfds), NULL, NULL, &timeout);
if(-1 != ioctl(clientfd, FIONREAD, &nread)){

if(nread != 0) {

result = readable;
} else {

result = disconnect;
}
}
以这种方式判断的话,必须保证read或者recv的操作在iocl之后,如果read或者recv的操作在ioctl之前或者在其他线程里面,则有可能出现ioctl中 nread的值为0的情况
原因: ioctl判断的是socket中接收缓冲区中的可读数据的size,read或者recv操作会从内核中socket的缓冲区中读取数据,执行读取操作后,内核缓冲区的数据的额size可能为0, 如果这时候结合ioctl 中的nread进行判断socket是否断开,则会出现误判。
对端socket并没有断开,至少缓冲区的数据被读取了。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/163631.html原文链接:https://javaforall.net

(0)
上一篇 2022年7月23日 上午6:46
下一篇 2022年7月23日 上午6:46


相关推荐

  • Spring Data JPA 写SQL语句也可以如此简单

    Spring Data JPA 写SQL语句也可以如此简单在使用SpringDataJPA的时候,通常我们只需要继承JpaRepository就能获得大部分常用的增删改查的方法。有时候我们需要自定义一些查询方法,可以写自定义HQL语句像这样/***根据关注者id查找所有记录(查找关注的人的id)**@paramfromUserId*@return*/…

    2022年10月20日
    3
  • SPI 协议详解_cifs协议

    SPI 协议详解_cifs协议SPI协议详解1、SPI简介2、SPI四线3、SPI四种工作模式4、SPI时序图1、SPI简介SPI全称是SerialPerripheralInterface,也就是串行外围设备接口。SPI是Motorola公司推出的一种同步串行接口技术,是一种高速、全双工的同步通信总线,SPI时钟频率相比I2C要高很多,最高可以工作在上百MHz。SPI以主从方式工作,通常是有一个主设备和一个或多个从设备,一般SPI需要4根线,但是也可以使用三根线(单向传输)2、SPI四线

    2022年10月15日
    4
  • lunix针对用户的常用操作命令

    lunix针对用户的常用操作命令(1)使用who查看目前有哪些用户登录了服务器,见下图[root@vm18~]#whorootpts/02015-03-2710:23(192.168.9.188)从上文可以看出用户root使用ip地址为192.168.9.188登录到linux系统上 (2)看看root都在什么时间登录过系统 [root@vm18~]#lastrootrootpts/0192.168.9.1…

    2022年10月3日
    6
  • c语言getchar()的用法_c=getchar()

    c语言getchar()的用法_c=getchar()文章目录getchar()函数定义函数返回值注意区分getchar和scanfgetchar的使用实例getchar()函数定义getchar()-字符输入函数,没有参数,从输入缓冲区里面读取一个字符-「一次只能读取一个字符」EOF(-1)-endoffile文件结束标志-键盘上用ctrl+z实现先查一下文档函数返回值该函数以无符号char强制转换为int的形式返回读取的字符,如果到达文件末尾或发生读取错误,则返回EOF(-1

    2022年10月18日
    4
  • ▲ Android 使用RecycleView自定义日历签到效果

    ▲ Android 使用RecycleView自定义日历签到效果

    2021年3月12日
    170
  • wptx64能卸载吗_wptx64是什麼「建议收藏」

    wptx64能卸载吗_wptx64是什麼「建议收藏」SOLIDWORKSPDMServer和SOLIDWORKSSolidNetWorkLicenseManager,都支援在WindowsServer2008R2或WindowsServer2012和2012R2上進行安裝。WindowsInstaller:,(不適用).WindowsPerformanceToolkit:,WPTx64-x86_en-us…

    2022年5月2日
    111

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号