对于面向连接的socket,需要会用监听连接的到来,并且使用backlog参数来限制连接数量;具体backlog限制的内容,请参考本博另外一篇文章,本文结尾提供链接地址;

  1. /*
  2. * Perform a listen. Basically, we allow the protocol to do anything
  3. * necessary for a listen, and if that works, we mark the socket as
  4. * ready for listening.
  5. */
  6.  
  7. SYSCALL_DEFINE2(listen, int, fd, int, backlog)
  8. {
  9. struct socket *sock;
  10. int err, fput_needed;
  11. int somaxconn;
  12.  
  13. /* 查找socket结构 */
  14. sock = sockfd_lookup_light(fd, &err, &fput_needed);
  15. if (sock) {
  16. somaxconn = sock_net(sock->sk)->core.sysctl_somaxconn;
  17.  
  18. /* backlog不能超过设置值 */
  19. if ((unsigned int)backlog > somaxconn)
  20. backlog = somaxconn;
  21.  
  22. /* 安全模块检查 */
  23. err = security_socket_listen(sock, backlog);
  24. if (!err)
  25. /* 调用对应类型的listen函数,只有SOCK_STREAM支持listen */
  26. err = sock->ops->listen(sock, backlog);
  27.  
  28. fput_light(sock->file, fput_needed);
  29. }
  30. return err;
  31. }

inet_listen、数对socket类型,连接状态等进行基本的校验,如果已经处于listen状态,则只会调整backlog的值,如果尚未处于listen状态,则调用传输层的listen实现函数进行针对的listen操作;

  1. /*
  2. * Move a socket into listening state.
  3. */
  4. int inet_listen(struct socket *sock, int backlog)
  5. {
  6. struct sock *sk = sock->sk;
  7. unsigned char old_state;
  8. int err;
  9.  
  10. lock_sock(sk);
  11.  
  12. err = -EINVAL;
  13.  
  14. /* 检查socket状态和类型,仅支持SOCK_STREAM */
  15. if (sock->state != SS_UNCONNECTED || sock->type != SOCK_STREAM)
  16. goto out;
  17.  
  18. /* 记录连接当前状态 */
  19. old_state = sk->sk_state;
  20.  
  21. /* 检查连接状态,需为close或者listen */
  22. if (!(( << old_state) & (TCPF_CLOSE | TCPF_LISTEN)))
  23. goto out;
  24.  
  25. /* Really, if the socket is already in listen state
  26. * we can only allow the backlog to be adjusted.
  27. */
  28. /* 如果尚未listen过 */
  29. if (old_state != TCP_LISTEN) {
  30. /* Enable TFO w/o requiring TCP_FASTOPEN socket option.
  31. * Note that only TCP sockets (SOCK_STREAM) will reach here.
  32. * Also fastopen backlog may already been set via the option
  33. * because the socket was in TCP_LISTEN state previously but
  34. * was shutdown() rather than close().
  35. */
  36. /* TFO相关*/
  37. if ((sysctl_tcp_fastopen & TFO_SERVER_WO_SOCKOPT1) &&
  38. (sysctl_tcp_fastopen & TFO_SERVER_ENABLE) &&
  39. !inet_csk(sk)->icsk_accept_queue.fastopenq.max_qlen) {
  40. fastopen_queue_tune(sk, backlog);
  41. tcp_fastopen_init_key_once(true);
  42. }
  43.  
  44. /* 开始监听 */
  45. err = inet_csk_listen_start(sk, backlog);
  46. if (err)
  47. goto out;
  48. }
  49.  
  50. /* 设置backlog,包括已经listen过,调整backlog */
  51. sk->sk_max_ack_backlog = backlog;
  52. err = ;
  53.  
  54. out:
  55. release_sock(sk);
  56. return err;
  57. }
  58. EXPORT_SYMBOL(inet_listen);

其中tcp层对于listen的实现,实际上也是调用了inet_csk_get_port函数,与bind()系统调用在tcp层的调用函数一致,listen的时候,如果发现尚未绑定端口,则自动选择端口绑定,已经绑定端口,则进行相关检查;具体请参考bind()系统调用的tcp层实现;请阅读<TCP层bind系统调用的实现分析>;

关于TCP的listen函数和backlog参数说明,请移步以下文章<TCP之listen&backlog>;

listen系统调用的更多相关文章

  1. 我们通过一个服务器程序,以研究backlog参数对listen系统调用的影响,运行截图如下

    启动服务器程序,服务器程序正在等待客户端的连接 我们使用一次telnet命令就建立一个连接 打开多个终端窗口执行下列命名 #telnet 192.168.255.128 4444多次执行 然后我们执行 ...

  2. Linux进程间通信(八):流套接字 socket()、bind()、listen()、accept()、connect()、read()、write()、close()

    前面说到的进程间的通信,所通信的进程都是在同一台计算机上的,而使用socket进行通信的进程可以是同一台计算机的进程,也是可以是通过网络连接起来的不同计算机上的进程.通常我们使用socket进行网络编 ...

  3. linux独有的sendfile系统调用--“零拷贝,高效”

    参考:http://blog.csdn.net/caianye/article/details/7576198 如今几乎每个人都听说过Linux中所谓的"零拷贝"特性,然而我经常碰 ...

  4. 从Linux源码看Socket(TCP)的listen及连接队列

    从Linux源码看Socket(TCP)的listen及连接队列 前言 笔者一直觉得如果能知道从应用到框架再到操作系统的每一处代码,是一件Exciting的事情. 今天笔者就来从Linux源码的角度看 ...

  5. 深入探索 Linux listen() 函数 backlog 的含义

    1:listen()回顾以及问题引入 2:正确的解释 3:实验验证 1:listen()回顾以及问题引入 listen()函数是网络编程中用来使服务器端开始监听端口的系统调用,首先来回顾下listen ...

  6. Linux内核 TCP/IP、Socket参数调优

    Linux内核 TCP/IP.Socket参数调优 2014-06-06  Harrison....   阅 9611  转 165 转藏到我的图书馆   微信分享:   Doc1: /proc/sy ...

  7. 计算机网络及TCP/IP知识点(全面,慢慢看)

    TCP/IP网络知识点总结 一.总述 1.定义:计算机网络是一些互相连接的.自治的计算机的集合.因特网是网络的网络. 2.分类: 根据作用范围分类: 广域网 WAN (Wide Area Networ ...

  8. IPC——流套接字通信

    Linux进程间通信——使用流套接字 前面说到的进程间的通信,所通信的进程都是在同一台计算机上的,而使用socket进行通信的进程可以是同一台计算机的进程,也是可以是通过网络连接起来的不同计算机上的进 ...

  9. mysql show variables系统变量详解

    mysql系统变量详解 mysqld服务器维护两种变量.全局变量影响服务器的全局操作.会话变量影响具体客户端连接相关操作. 服务器启动时,将所有全局变量初始化为默认值.可以在选项文件或命令行中指定的选 ...

随机推荐

  1. Jackson 使用

    // 序列化出来的 JSON, 不包含值为 NULL 类型字段. mapper.setSerializationInclusion(Include.NON_NULL); Jackson provide ...

  2. AptanaStudio3+PHP程序远程调试的方法和步骤

    php是执行在服务器上的脚本程序,通常调试bug,直接在浏览器页面就可以打印出错误信息,凭此基本能解决所有bug,但是有时候,可以说大多数时候,php会直接处理客户端的请求,作为数据接口传递数据,没有 ...

  3. 【Learning】分数规划

    分数规划 ​ 分数规划是一类决策性问题.一般地,题目会要求你针对问题规划一种方案,使得其代价函数最小或最大.其中,代价函数一般是分数形式,且分子分母的构成元素一般呈现一一对应关系. 直接上例题观察:B ...

  4. 洛谷 P4279 [SHOI2008]小约翰的游戏 解题报告

    P4279 [SHOI2008]小约翰的游戏 题目描述 小约翰经常和他的哥哥玩一个非常有趣的游戏:桌子上有\(n\)堆石子,小约翰和他的哥哥轮流取石子,每个人取的时候,可以随意选择一堆石子,在这堆石子 ...

  5. 利用Array Prototype的方法来实现对dom集合的筛选、indexOf、map等功能

    <!DOCTYPE html><html> <head> <title>TODO supply a title</title> <me ...

  6. 从function的定义看JavaScript的预加载

    在JavaScript中定义一个函数,有两种写法: function ftn(){} // 第一种 var ftn = function(){} // 第二种 有人说,这两种写法是完全等价的.但是在解 ...

  7. 团体程序设计天梯赛 L1-049. 天梯赛座位分配(测试数据+不同方法)

    Data: /*33 2 1#11 4 7 10 13 16 19 22 25 2831 33 35 37 39 41 43 45 47 4951 53 55 57 59 61 63 65 67 69 ...

  8. POI的XWPFParagraph.getRuns分段问题 多余逗号

    POI的XWPFParagraph.getRuns分段问题 2018年08月28日 09:49:32 银爪地海贼 阅读数:376   这是我的模板 后台打印出来是分段的 造成这样的原因是${name} ...

  9. ubunto 16.04 lts 源

    http://601502546.blog.163.com/blog/static/2596107620171502517889 国内有很多ubuntu的源,包括:网易源(这个之前用过,速度很快的), ...

  10. List保存在ViewState

    private List<SYSUAO> UserRoleList { get { return ViewState["UserRoleList"] as List&l ...