listen内部执行的时候到底干了啥?

2022-10-23 06:16:28 0 105

大家都知道,在创建一个服务器程序的时候,需要先listen一下,然后才能接收客户端的请求。例如下面的这段代码我们再熟悉不过了。int main(int argc, char const *argv[]){ int fd = socket(AF_INET, SOCK_STREAM, 0); bind(fd, ); listen(fd, 128); accept(fd, );

那么我们今天来思考一个问题,为什么需要listen一下才能接收连接?或者换句话说,listen内部执行的时候到底干了啥?

如果你也想搞清楚listen内部的这些秘密,那么请跟我来!一、创建socket

服务器要做的第一件事就是先创建一个socket。具体就是通过调用socket函数。当socket函数执行完毕后,在用户层视角我们是看到返回了一个文件描述符fd。但在内核中其实是一套内核对象组合,大体结构如下。

这里简单了解这个结构就行,后面我们在源码中看到函数指针调用的时候需要回头再来看它。二、内核执行listen2.1listen系统调用

我在net/socket.c下找到了listen系统调用的源码。//file: net/socket.cSYSCALL_DEFINE2(listen, int, fd, int, backlog){ //根据 fd 查找 socket 内核对象 sock = sockfd_lookup_light(fd, &err, &fput_needed); if (sock) {//获取内核参数 net.core.somaxconnsomaxconn = sock_net(sock->sk)->core.sysctl_somaxconn;if ((unsigned int)backlog > somaxconn)backlog = somaxconn;//调用协议栈注册的 listen 函数err = sock->ops->listen(sock, backlog);}

用户态的socket文件描述符只是一个整数而已,内核是没有办法直接用的。所以该函数中第一行代码就是根据用户传入的文件描述符来查找到对应的socket内核对象。

再接着获取了系统里的net.core.somaxconn内核参数的值,和用户传入的backlog比较后取一个最小值传入到下一步中。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

免责声明:内容来自用户上传发布或新闻客户端自媒体,本站仅提供信息存储空间服务,如违规请联系删除。

玩技资源 国内新闻 listen内部执行的时候到底干了啥? https://www.52diyhome.com/2022/10/64806.html

如遇资源失效请马上联系微信进行退款

常见问题
  • 答:资源大部分来源于网络和本站作者若有侵权请您联系管理员删除2523030730
查看详情
  • 玩技平台的主要负责内容是提供给作者售卖资源的平台,买家有对作者投诉的权利,投诉成功后会获取相应的补偿机制。官方唯一投诉通道客服QQ:2523030730转接人工服务,投诉专属客服工号【2】
查看详情
  • 本站已开启了作者实名认证,在购买商品时请尽量选择已认证的作者,不用担心跑路和无人售后的问题。如果出现问题,本站将采取报警的方式来指正作者进行诈骗行为,并将其身份资料提供给警方处理。
查看详情
  • 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
查看详情

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 工作日在线 专业服务

  • 0 +

    访问总数

  • 0 +

    会员总数

  • 0 +

    资源总数

  • 0 +

    今日发布

  • 0 +

    本周发布

  • 0 +

    运行天数

资源在于分享,创作来源想象