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参数是没用的,还要修改系统的设置才行。

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

  1. sys接口linux编程,网络编程常用接口的内核实现----sys_listen()

    四.reqsk_queue_alloc()函数 reqsk_queue_alloc()的源码实现及分析如下所示: /* * 用来分配连接请求块散列表,然后将其连接到所在传输控制块的请求 * 块容器中. ...

  2. socket网络编程常用C语言api函数(Linux)

    参考<Linux高性能服务器编程> 网络编程常用函数 字节序 ip转换 地址结构体 socket相关函数 数据读写 获取地址信息 获取或者设置套接字属性 通过域名或地址获取主机信息 字节序 ...

  3. linux网络编程常用函数详解与实例(socket--bind--listen--accept)

    常用的网络命令: netstat 命令netstat是用来显示网络的连接,路由表和接口统计等网络的信息.netstat有许多的选项我们常用的选项是 -an 用来显示详细的网络状态.至于其它的选项我们可 ...

  4. 【C/C++服务器开发】socket网络编程函数接口详解

    文章目录 一.前言 TCP 网络编程 结合三次握手连接的 TCP socket 结合四次次挥手的 TCP socket 二.socket常用函数和数据结构 1.socket()函数 2.bind() ...

  5. Android网络编程常用的三种方法

    最近看了看以前的代码,发现很多东西不看不写慢慢忘记了,所以想总结下,首先想到的就是android下的网络编程.慢慢总结,慢慢完善. 首先android常用的有三种网络通信方式,socket编程.Htt ...

  6. Linux网络编程常用api

    文章目录 总览 大端小端 大小端检测 大小端转换 socket地址API 通用socket地址 专用socket地址 PF_UNIX专用地址 PF_INET PF_INET6 总结 IP转换函数 例子 ...

  7. socket网络编程常用的结构及函数小结

    IP地址的作用时标示计算机的网卡地址,每台计算机都有一个IP地址:端口,是指计算机中为了标示在计算机中访问网络的不同程序而设的编号,并不是网卡接线的端口,而是不同程序的逻辑编号,并不是实际存在的:域名 ...

  8. 与网络编程有关的部分内核参数

    几乎所有的内核模块,包括内核核心模块和驱动程序,都在/proc/sys 文件系统下提供了某些配置文件以提供用户调整模块的属性和行为.通常一个配置文件对应一个内核参数,文件名就是参数的名字,文件的内容是 ...

  9. Linux socket 网络编程 常用头文件

    一 三种类型的套接字: 1.流式套接字(SOCKET_STREAM) 提供面向连接的可靠的数据传输服务.数据被看作是字节流,无长度限制.例如FTP协议就采用这种. 2.数据报式套接字(SOCKET_D ...

最新文章

  1. win10使用python的strftime有错误_17个常见的Python运行时错误
  2. C语言rewind()函数(设置文件位置为给定流 stream 的文件的开头)(回到文件开头重读)
  3. 【转】一步步构建大型网站架构
  4. [Pyhon疫情大数据分析] 三.新闻信息抓取及词云可视化、文本聚类和LDA主题模型文本挖掘
  5. WePY:在质疑中前进 | 文末福利
  6. python读取csv文件_python3.0读取csv文件
  7. 给排水规范大全2020_住宅电气、给排水、消防安装工程的质量通病分析
  8. 请解释自动装配模式的区别?_如何从齿条优化方面有效节约机床装配时间
  9. c++读取excel_Python读取并提取xlsx数据+去趋势和高通滤波与低通滤波
  10. 机器视觉:PC式视觉系统与嵌入式视觉系统区别
  11. java第五章循环结构总结_Java理论学习三分钟-流程控制之循环结构(3)
  12. 高级政工师具备的能力_环境污染治理能力评价资质标准【广东资质申报专家】...
  13. 生成M3U8播放地址用于手机HLS Player(M3U8Player)观看电视频道直播方案
  14. 双叉积——拉格朗日公式证明
  15. 怎样轻松批量追踪拼多多快递?
  16. 论文选题、标题、摘要怎么写
  17. 洛谷P1179 [NOIP2010 普及组] 数字统计题解
  18. android虚拟手机云之二:应用多开
  19. 微信小程序(三)常见组件
  20. 15类图神经网络的应用场景总结

热门文章

  1. SELECT TOP n 性能测试
  2. mysql 错误问题_Mysql常见的几个错误问题及解决方法:
  3. java 多线程生产者_java-Runnable加锁实现生产者和消费者的多线程问题
  4. 后台导出大量数据超时报 nginx404错误
  5. 当你在浏览器输入一个网址,如http://www.taobao.com,按回车之后发生了什么?
  6. 万能点位图软件_红色网格衣+很多漂亮的花边像素图,绣手帕花边的十字绣图...
  7. mysql二维数据转一维存_二维数组转一维数组
  8. unix修改服务器时间格式,处理unix中的日期格式
  9. 【微信网页直接下载app】微信跳转-微信浏览器中直接唤起本地浏览器和App
  10. springboot 控制台程序读取配置文件(原创)