listen系统调用
对于面向连接的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系统调用的更多相关文章
- 我们通过一个服务器程序,以研究backlog参数对listen系统调用的影响,运行截图如下
启动服务器程序,服务器程序正在等待客户端的连接 我们使用一次telnet命令就建立一个连接 打开多个终端窗口执行下列命名 #telnet 192.168.255.128 4444多次执行 然后我们执行 ...
- Linux进程间通信(八):流套接字 socket()、bind()、listen()、accept()、connect()、read()、write()、close()
前面说到的进程间的通信,所通信的进程都是在同一台计算机上的,而使用socket进行通信的进程可以是同一台计算机的进程,也是可以是通过网络连接起来的不同计算机上的进程.通常我们使用socket进行网络编 ...
- linux独有的sendfile系统调用--“零拷贝,高效”
参考:http://blog.csdn.net/caianye/article/details/7576198 如今几乎每个人都听说过Linux中所谓的"零拷贝"特性,然而我经常碰 ...
- 从Linux源码看Socket(TCP)的listen及连接队列
从Linux源码看Socket(TCP)的listen及连接队列 前言 笔者一直觉得如果能知道从应用到框架再到操作系统的每一处代码,是一件Exciting的事情. 今天笔者就来从Linux源码的角度看 ...
- 深入探索 Linux listen() 函数 backlog 的含义
1:listen()回顾以及问题引入 2:正确的解释 3:实验验证 1:listen()回顾以及问题引入 listen()函数是网络编程中用来使服务器端开始监听端口的系统调用,首先来回顾下listen ...
- Linux内核 TCP/IP、Socket参数调优
Linux内核 TCP/IP.Socket参数调优 2014-06-06 Harrison.... 阅 9611 转 165 转藏到我的图书馆 微信分享: Doc1: /proc/sy ...
- 计算机网络及TCP/IP知识点(全面,慢慢看)
TCP/IP网络知识点总结 一.总述 1.定义:计算机网络是一些互相连接的.自治的计算机的集合.因特网是网络的网络. 2.分类: 根据作用范围分类: 广域网 WAN (Wide Area Networ ...
- IPC——流套接字通信
Linux进程间通信——使用流套接字 前面说到的进程间的通信,所通信的进程都是在同一台计算机上的,而使用socket进行通信的进程可以是同一台计算机的进程,也是可以是通过网络连接起来的不同计算机上的进 ...
- mysql show variables系统变量详解
mysql系统变量详解 mysqld服务器维护两种变量.全局变量影响服务器的全局操作.会话变量影响具体客户端连接相关操作. 服务器启动时,将所有全局变量初始化为默认值.可以在选项文件或命令行中指定的选 ...
随机推荐
- Jackson 使用
// 序列化出来的 JSON, 不包含值为 NULL 类型字段. mapper.setSerializationInclusion(Include.NON_NULL); Jackson provide ...
- AptanaStudio3+PHP程序远程调试的方法和步骤
php是执行在服务器上的脚本程序,通常调试bug,直接在浏览器页面就可以打印出错误信息,凭此基本能解决所有bug,但是有时候,可以说大多数时候,php会直接处理客户端的请求,作为数据接口传递数据,没有 ...
- 【Learning】分数规划
分数规划 分数规划是一类决策性问题.一般地,题目会要求你针对问题规划一种方案,使得其代价函数最小或最大.其中,代价函数一般是分数形式,且分子分母的构成元素一般呈现一一对应关系. 直接上例题观察:B ...
- 洛谷 P4279 [SHOI2008]小约翰的游戏 解题报告
P4279 [SHOI2008]小约翰的游戏 题目描述 小约翰经常和他的哥哥玩一个非常有趣的游戏:桌子上有\(n\)堆石子,小约翰和他的哥哥轮流取石子,每个人取的时候,可以随意选择一堆石子,在这堆石子 ...
- 利用Array Prototype的方法来实现对dom集合的筛选、indexOf、map等功能
<!DOCTYPE html><html> <head> <title>TODO supply a title</title> <me ...
- 从function的定义看JavaScript的预加载
在JavaScript中定义一个函数,有两种写法: function ftn(){} // 第一种 var ftn = function(){} // 第二种 有人说,这两种写法是完全等价的.但是在解 ...
- 团体程序设计天梯赛 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 ...
- POI的XWPFParagraph.getRuns分段问题 多余逗号
POI的XWPFParagraph.getRuns分段问题 2018年08月28日 09:49:32 银爪地海贼 阅读数:376 这是我的模板 后台打印出来是分段的 造成这样的原因是${name} ...
- ubunto 16.04 lts 源
http://601502546.blog.163.com/blog/static/2596107620171502517889 国内有很多ubuntu的源,包括:网易源(这个之前用过,速度很快的), ...
- List保存在ViewState
private List<SYSUAO> UserRoleList { get { return ViewState["UserRoleList"] as List&l ...