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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ZOJ1100 状压DP +深搜

    ZOJ1100 状压DP +深搜

    2021年12月4日
  • Java二叉树前序遍历[通俗易懂]

    Java二叉树前序遍历[通俗易懂]给你二叉树的根节点root,返回它节点值的前序遍历。示例1:输入:root=[1,null,2,3]输出:[1,2,3]示例2:输入:root=[]输出:[]示例3:输入:root=[1]输出:[1]示例4:输入:root=[1,2]输出:[1,2]示例5:输入:root=[1,null,2]输出:[1,2]提示:树中节点数目在范围[0,100]内-100<=Node.val<=100进阶:递归算法很简单

    2022年9月6日
  • siamfc++代码_siacoin

    siamfc++代码_siacoinSiamFC++:TowardsRobustandAccurateVisualTrackingwithTargetEstimationGuidelines摘要。视觉跟踪问题要求对给定目标进行高效的鲁棒分类和精确的状态估计。以往的方法提出了多种目标状态估计方法,但很少有方法考虑到视觉跟踪问题本身的特殊性。在仔细分析的基础上,为高性能通用目标跟踪器的设计提供了一套实用的目标状态估计指导原则。遵循这些指导原则,我们通过引入分类和目标状态估计分支(G1)、无模糊性分类评分(G2)、无先验知识跟

    2022年10月1日
  • sqlserver不存在或拒绝访问怎么办_sql数据库连接不上

    sqlserver不存在或拒绝访问怎么办_sql数据库连接不上Navicat连接SQLserver数据库时报错:未发现数据源名称并且未指定默认驱动程序导致原因:navicat没有安装sqlserver驱动解决办法:打开Navicat的安装路径,Navicat自带sqlncli_x64.msi,双击安装一下;安装完成之后重启Navicat即可连接成功!…

    2022年10月9日
  • 如何使用eclipse创建JAVA项目并写一个简单的HelloWorld

    如何使用eclipse创建JAVA项目并写一个简单的HelloWorld打开eclipse软件,选择好工作区域(就是项目的储存地址)后登陆。File-New-Project选择JavaProject输入项目名称点击完成(Finish)在SRC(SRC是专门放java源代码的文件夹,就是你在IDE里编写的各个java类的文件都在里面)中新建package包包的命名规范:包名全部使用小写。包名通常由若干个标识符…

    2022年7月24日
  • god is a girl 中文意思_π字符

    god is a girl 中文意思_π字符E- godisagirlTimeLimit:1000MS     MemoryLimit:32768KB     64bitIOFormat:%I64d&%I64uSubmit StatusDescriptionOneday,whenIwasdreaming,godwentintomydream,shewaspr

    2022年10月8日

发表回复

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

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