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

 /*
* 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; /* 查找socket结构 */
sock = sockfd_lookup_light(fd, &err, &fput_needed);
if (sock) {
somaxconn = sock_net(sock->sk)->core.sysctl_somaxconn; /* backlog不能超过设置值 */
if ((unsigned int)backlog > somaxconn)
backlog = somaxconn; /* 安全模块检查 */
err = security_socket_listen(sock, backlog);
if (!err)
/* 调用对应类型的listen函数,只有SOCK_STREAM支持listen */
err = sock->ops->listen(sock, backlog); fput_light(sock->file, fput_needed);
}
return err;
}

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

 /*
* Move a socket into listening state.
*/
int inet_listen(struct socket *sock, int backlog)
{
struct sock *sk = sock->sk;
unsigned char old_state;
int err; lock_sock(sk); err = -EINVAL; /* 检查socket状态和类型,仅支持SOCK_STREAM */
if (sock->state != SS_UNCONNECTED || sock->type != SOCK_STREAM)
goto out; /* 记录连接当前状态 */
old_state = sk->sk_state; /* 检查连接状态,需为close或者listen */
if (!(( << old_state) & (TCPF_CLOSE | TCPF_LISTEN)))
goto out; /* Really, if the socket is already in listen state
* we can only allow the backlog to be adjusted.
*/
/* 如果尚未listen过 */
if (old_state != TCP_LISTEN) {
/* Enable TFO w/o requiring TCP_FASTOPEN socket option.
* Note that only TCP sockets (SOCK_STREAM) will reach here.
* Also fastopen backlog may already been set via the option
* because the socket was in TCP_LISTEN state previously but
* was shutdown() rather than close().
*/
/* TFO相关*/
if ((sysctl_tcp_fastopen & TFO_SERVER_WO_SOCKOPT1) &&
(sysctl_tcp_fastopen & TFO_SERVER_ENABLE) &&
!inet_csk(sk)->icsk_accept_queue.fastopenq.max_qlen) {
fastopen_queue_tune(sk, backlog);
tcp_fastopen_init_key_once(true);
} /* 开始监听 */
err = inet_csk_listen_start(sk, backlog);
if (err)
goto out;
} /* 设置backlog,包括已经listen过,调整backlog */
sk->sk_max_ack_backlog = backlog;
err = ; out:
release_sock(sk);
return err;
}
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. OpenSSL 自签名证书

    通过下面9步,可以轻松生成自签名证书. 1.安装.部署OpenSSL 略 2.创建文件夹(下面通常root文件夹).用来放即将创建的各种证书等.如:I:\Key10.167.219.64 3.在roo ...

  2. JS中JSON对象和JSON字符串的相互转化

    转:http://www.cnblogs.com/wbyp/p/7086318.html 一.JSON字符串转换为JSON对象 var str = '{"name":"c ...

  3. SSL身份认证原理 - 目标: 搞清楚数字证书和数字签名的关系

    1  概述 1.1  产生背景 基于万维网的电子商务和网上银行等新兴应用,极大地方便了人们的日常生活,受到人们的青睐.由于这些应用都需要在网络上进行在线交易,它们对网络通信的安全性提出了更高的要求.传 ...

  4. MT【149】和式变形

    (2018浙江省赛14题)将$2n(n\ge2)$个不同的整数分成两组$a_1,a_2,\cdots,a_n;b_1,b_2,\cdots,b_n$.证明:$\sum\limits_{1\le i\l ...

  5. keepalived回顾

    Keepalived是lvs的扩展项目,因此它们之间具备良好的兼容性. 通过对服务器池对象的健康检查,实现对失效机器/服务的故障隔离: 负载均衡器之间的失败切换failover,通过VRRPv2 st ...

  6. bzoj 2178 自适应Simpson积分

    #include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #i ...

  7. C++ strcat(template版本)

    template<unsigned N, unsigned M> inline std::shared_ptr<char> strcat(const char (&p1 ...

  8. Python【经典类与新式类】

    经典类多继承的调用方法顺序是:深度优先查询,如下图:   新式类多继承的调用方法顺序是:广度优先查询,如下图:   可以使用下面的代码进行实验验证: #经典类class A: def __init__ ...

  9. 总结: 《jQuery基础教程》 1-4章

    前言: 因为公司的项目用到了jQuery+Bootstrap,而Bootstrap基于jQuery,突然发现自己只是很久前看过jQuery的视频教程,对jQuery的一些API有一些了解,在使用中还是 ...

  10. 什么是ground truth(GT)

    转自ground truth的含义 ground truth在不同的地方有不同的含义,下面是参考维基百科的解释,ground truth in wikipedia. 1.在统计学和机器学习中 在机器学 ...