网络编程常用接口的内核实现----sys_listen()

listen()函数仅在TCP服务器端调用,它做两个事情:将套接字转换到LISTEN状态和设置套接上的最大连接队列。listen()对应的内核实现为sys_listen(),下面开始对其实现作具体的分析。

一、sys_listen()函数

sys_listen()的源码实现及分析如下所示:

/*
 * Perform a listen. Basically, we allow the protocol to do anything
 * necessary for a listen, and if that works, we mark the socket as
 * ready for listening.
 */

SYSCALL_DEFINE2(listen, int, fd, int, backlog)
{
 struct socket *sock;
 int err, fput_needed;
 int somaxconn;

 sock = sockfd_lookup_light(fd, &err, &fput_needed);
 if (sock) {
  /*
  * sysctl_somaxconn存储的是服务器监听时,允许每个套接字连接队列长度
                * 的最大值,默认值是SOMAXCONN,即128,在sysctl_core_net_init()函数中初始化。
                * 在proc文件系统中可以通过修改/proc/sys/net/core/somaxconn文件来修改这个值。
  */
  somaxconn = sock_net(sock->sk)->core.sysctl_somaxconn;
  /*
  * 如果指定的最大连接数超过系统限制,则使用系统当前允许的连接队列
  * 中连接的最大数。
  */
  if ((unsigned)backlog > somaxconn)
   backlog = somaxconn;

  err = security_socket_listen(sock, backlog);
  if (!err)
                      /*
    * 如果是TCP套接字,sock->ops指向的是inet_stream_ops,
    * sock->ops是在inet_create()函数中初始化,所以listen接口
    * 调用的是inet_listen()函数。
    */
   err = sock->ops->listen(sock, backlog);

  fput_light(sock->file, fput_needed);
 }
 return err;
}

sys_listen()的代码流程图如下所示:

 

 

 

 

 

sys_listen()的代码流程和sys_bind()很像,都是先调用sockfd_lookup_light()获取描述符对应的socket实例,然后通过调用sock->ops中的操作接口来完成真正的操作。接下来看这段代码:

if ((unsigned)backlog > somaxconn)
   backlog = somaxconn;

这里可以看出,如果指定的最大连接队列数超过系统限制,会使用系统中设置的最大连接队列数。所以,如果想扩大套接字的连接队列,只调整listen()的backlog参数是没用的,还要修改系统的设置才行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/434534.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux查看启动配置文件内容,Linux开机启动项的查看和设置方法总结

一、查看开机自启项1.Centos7自启项查看方式从Centos6的chkconfig改为:systemctl list-unit-files2.用grep过滤查看,比如:查看启动项:systemctl list-unit-files | grep enable查看sshd服务自启动情况:systemctl list-…

XP Embedded:不同的用户使用不同的外壳程序

摘要: 能够使应用程序成为外壳程序是 Windows XP Embedded 的关键功能之一。设备可以在自定义外壳程序而不是 Explorer 外壳程序中启动,这提供了两个好处。第一个好处是系统能够更快地启动。Explorer 外壳程序需要花费大量的时间来加载所有支持库和文件…

linux系统中 库分为静态库和,Linux系统中“动态库”和“静态库”那点事儿-【经典好文】...

今天我们主要来说说Linux系统下基于动态库(.so)和静态(.a)的程序那些猫腻。在这之前,我们需要了解一下源代码到可执行程序之间到底发生了什么神奇而美妙的事情。在linux操作系统中,普遍使用ELF格式作为可执行程序或者程序生成过程中的中间格式。ELF(Exec…

linux上的壁纸软件下载,Ubuntu 17.10上安装开源壁纸工具Wallch 4.0

在Ubuntu 17.04上安装WallchWallch是一款免费的开源通用壁纸更换器,用户可以在设置的时间更改桌面背景图片。它会在桌面上更改并显示随机图片或维基百科的当天图片。它还具有一个实时地球Living Earth壁纸,每30分钟更换桌面背景,以显示阳光和…

linux find显示文件的基本信息,命令find搜索文件,命令stat查看文件的详细信息

命令stat命令语法stat(选项)(参数)命令描述命令stat用于显示文件的状态信息。stat命令的输出信息比ls命令的输出信息要更详细。命令选项-L:支持符号连接;-f:显示文件系统状态而非文件状态;-t:以简洁方式输出信息&#…

Linux rpm 命令参数使用详解[介绍和应用]

RPM是RedHat Package Manager(RedHat软件包管理工具)类似Windows里面的“添加/删除程序” rpm 执行安装包 二进制包(Binary)以及源代码包(Source)两种。二进制包可以直接安装在计算机中,而源代…

Ubuntu10.10的网络配置

有一阵子着实对Ubuntu的网络配置很迷惑,耐下心来仔细上网找了找,有点小心得,总结一下。 先说下大概的配置过程,再去细究一些情况。 一、配置大概分三类:通过配置文件配置、通过命令配置、通过图形化的网络连接菜单配置…

DllMain详解

1 DLL的进入/退出函数 1.1 DllMain简介 跟exe有个main或者WinMain入口函数一样,DLL也有一个入口函数,就是DllMain。以“DllMain”为关键字,来看看MSDN帮助文档怎么介绍这个函数的。 The DllMain function is an optional method of entr…

linux安装tensorflow教程,真正从零开始,TensorFlow详细安装入门图文教程!

在正式开始之前我想说:一定要注意窗口给出的提示(英文)。在实际操作中可能会碰到各种各样的问题,但常见的问题其实都可以根据它的报错信息找到原因,只要上网搜一搜相应的信息就能解决,甚至它自己就会给出解决的建议。如果你发现你…

引路蜂地图API:Gis.Navigation包定义

本包提供了路口到路口实时导航API,从地图服务器返回的路径信息含有文字和路径的地理坐标信息,类NavigationEngine根据路径和当前坐标实现实时导航。它内部含用三个工作线程: Location Monitor 实时监视当前位置坐标是否偏离路径,如…

有些垃圾网站转载都不会

有时会看到我的文章被转载,只要保留作者信息和原文链接,并且忠实于原文都是很欢迎的。这里的忠实原文应该是最基本的了吧,转载嘛,最简单的也就是拷贝粘贴吧,可发现有些垃圾网站,连拷贝粘贴都做不好&#xf…

Linux部署动态网页,linux构建动态WEB服务器安装篇

linux构建动态WEB服务器安装篇发布时间:2008-09-18 08:50:01 作者:佚名 我要评论基本配置安装web服务器:httpd-2.X.X先优化吧根据CPU设置变量#export CFLAGS”-O2 -marchpentium4 -pipe” && CXXFLAGS$CFLAGS“-march”选项表示为特定的cpu…

sip事务与对话

一个事务通常由一个请求开始,由一个响应码(a response code)结束。VIA头域中的branch参数用来标识一个事务。 对话可以是开始于一个INVITE事务,结束于一个BYE事务。一个对话由FROM,TO和CALL-ID头域的结合所…

px、dp和sp,这些单位有什么区别?

相信每个Android新手都会遇到这个问题,希望这篇帖子能让你不再纠结。 px: 即像素,1px代表屏幕上一个物理的像素点; px单位不被建议使用,因为同样100px的图片,在不同手机上显示的实际大小可能不同&#x…

linux 例行性工作,Linux例行性工作

Linux例行性工作Linux:例行性工作什么是例行性工作?其实对于例行性工作而言就是在当前环境下周期性进行的必须工作。在Linux下,有2种例行性工作种类:一种是突发性,做完以后就没有的那种at:at是个可以处理仅执行一次就结束调度的命…

linux 下搭建yolov3错误,Ubuntu20.04+cuda11.1+yolo3 目标检测 深度学习系统 真正从0搭建 包含各类可能遇到的错误...

本篇文章包含内容较多,请参照目录浏览,在每一部分结束或,有该部分可能遇到的问题0、开始本教程前请先备份电脑中的重要文件!!!!一、Ubuntu20.04 搭建更详细的内容请参照该博客:https://www.cnblogs.com/mas…

SystemVerilog例子---traffic light

SystemVerilog例子---traffic light module traffic_light(output logic green_light,yellow_light,red_light,input sensor,input [15:0] green_downcnt,input [15:0] yellow_downcnt,input clock,input resetN); parameter R_BIT 0,G_BIT 1,Y_BIT 2;enum logic [2:0] {RE…

报表中的Excel操作之Aspose.Cells(Excel模板)

本篇中将简单记录下Aspose.Cells这个强大的Excel操作组件。这个组件的强大之处,就不多说,对于我们的报表总是会有导出Excel的处理,如果你使用微软Excel的com组件,那么对于简单的操作还行,但是多余复杂的模板&#xff0…

在飞音G801上运行OpenWRT+Asterisk

上篇文章介绍了如何在华硕RT-N11建立小型的SIP Server,本篇文章介绍将Asterisk移植到更为强大的VOIP网关G801上。G801是北京飞音时代的无线VoIP网关产品,在韩国SKT等运营商中广泛采用。G801支持802.11n 2T2R的无线路由,1WAN 4LAN的以太网&am…

android rsa加密工具类,GitHub - Lerist/encrypt: Android 加密解密工具包。

Encrypt(加密工具)字符串,byte[],文件等对象的加密和解密工具集合,包含了多种加密方案。加密类型摘要相关方法简单加密换一种编码格式Base64Util单向加密只能加密,不能解密MD5Util、SHAUtil对称加密使用相同的秘钥加密和解密AESUt…