ioctl() FIONREAD 检测socket是否有数据可读

ioctl() FIONREAD 检测socket是否有数据可读先看看FIONREAD的作用FIONREAD:Getthenumberofbytesintheinputbuffer获取接收缓存中数据的字节数项目中用来判断tcpsocket是否有数据接收到,但是出现了一个问题,对于用于accept的socket即调用listen()之后的socket,用FIONREAD,判断的时候报错,ioctl()返回-1,错误码是2…

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

先看看FIONREAD 的作用

FIONREAD:

Get the number of bytes in the input buffer 获取接收缓存中数据的字节数

项目中用来判断tcp socket是否有数据接收到,但是出现了一个问题,对于用于accept的socket 即调用listen()之后的socket,用FIONREAD,判断的时候报错,ioctl()返回-1,错误码是 22,无效的参数错误。

为什么会出现这个问题?

我做过测试刚创建好的socket 和 调用过bind()的socket  ioctl 都可以判断,只有listen()之后才会报错。

于是就查了一下 socket创建过程,总结了一下

1.socket创建之后是主动(暂且这么翻译吧),listen之后就变为被动,只能等待connect。

listen() marks the socket referred to by sockfd as a passive socket

2.socket创建之初的状态是UNCONNECT, listen之后就变为LISTEN状态。

3.listen()调用之后,维护的是未完成连接和完成连接两个队列,socket也会被放置到队列里。

4.connect 创建新的socket用于和客户端通讯。

FIONREAD用于判断接收缓存中是否存在可读数据,用于accept的socket处于LISTEN状态,只能被动接受连接,实际上已经没有IO了,不能用FIONREAD去判断socket是否有连接,ioctl认为它是个无效的参数。

如果总结的不对,可评论或私信,会及时纠正!

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 互联网海量视频数据的存储[通俗易懂]

    原文链接:http://www.docin.com/p-86312184.html?docfrom=rrela一、背景    互联网内容提供方式转变:用户创造内容。视频应用、网络游戏、搜索引擎等互联网衍生业务迅速发展,使得海量数据存储、管理和处理成为当今互联网公司面临的严峻问题。这些信息保存在存储设备上,便是高膨胀的海量数据,表1是不同互联网应用的规模。  互联网应用海量数据的共性:  1…

    2022年4月14日
    90
  • 建议收藏!推荐2020 年必备的几个 DevOps 工具

    作者:徐九  来源:https://segmentfault.com/a/1190000022908614 提到 DevOps 这个词,我相信很多人一定不会陌生。作为一个…

    2021年6月22日
    179
  • linux rpm 卸载 java_linux下用rpm 安装卸载jdk「建议收藏」

    linux rpm 卸载 java_linux下用rpm 安装卸载jdk「建议收藏」1、如果linux是centos的话,请先卸载openjdkjava-version,会有下面的信息:卸载默认的用root用户登陆到系统,打开一个终端输入#rpm-qa|grepgcj显示内容其中包含下面两行信息#java-1.4.2-gcj-compat-1.4.2.0-27jpp#java-1.4.2-gcj-compat-devel-l.4.2.0-27jpp卸载#rpm-…

    2022年9月15日
    4
  • java依赖jar包的方式_java打包命令

    java依赖jar包的方式_java打包命令大家都知道一个java应用项目可以打包成一个jar,当然你必须指定一个拥有main函数的mainclass作为你这个jar包的程序入口。具体的方法是修改jar包内目录META-INF下的MANIFEST.MF文件。比如有个叫做test.jar的jar包,里面有一个拥有main函数的mainclass:test.someClassName。我们就只要在MANIFEST.MF里面添加如下一句话:…

    2022年9月1日
    2
  • 关于数据库读写分离

    1、what读写分离读写分离,基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。2、why那么为什么要读写分离呢?因为数据库的“写”(写10000条数据到oracle可能要3分钟)操作是比较耗时的。但是数据库的“读”(从oracle读…

    2022年4月6日
    43
  • h3c路由器常用命令汇总_h3c命令手册

    h3c路由器常用命令汇总_h3c命令手册1、进入系统视图模式system-view2、为设备命名sysname3、显示当前配置displaycurrent-configuration4、中英文切换language-modeChinese|English5、进入以太网端口视图interfaceEthernet1/0/16、设置端口访问模式portlink-typeAccess|Trunk|Hybrid7、激活以太网端口undoshutdown8、关闭以太网端口shut

    2022年10月18日
    3

发表回复

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

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