网络编程常用接口的内核实现----sys_listen()
2013-11-06 15:47
417 查看
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()函数
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()
- 网络编程常用接口的内核实现----sys_socket()
- 网络编程常用接口的内核实现----sys_bind()
- TCPIP详解第1卷1.10标准化过程1.11RFC1.12标准的简单服务1.13互联网1.14实现1.15应用编程接口1.16测试网络
- linux网络编程常用函数详解与实例(socket-->bind-->listen-->accept)
- Android通过HttpURLConnection和HttpClient接口实现网络编程
- 网络编程中常用函数实现
- linux网络编程常用函数详解与实例(socket-->bind-->listen-->accept)
- linux网络编程常用函数详解与实例(socket-->bind-->listen-->accept)
- linux网络编程常用函数详解与实例(socket-->bind-->listen-->accept)
- linux网络编程常用函数详解与实例(socket-->bind-->listen-->accept)
- linux网络编程常用函数详解与实例(socket-->bind-->listen-->accept)
- linux网络编程常用函数详解与实例(socket-->bind-->listen-->accept)
- 网络编程用别人提供的接口(安卓常用)
- linux网络编程常用函数详解与实例(socket-->bind-->listen-->accept)
- Android通过HttpURLConnection和HttpClient接口实现网络编程
- UI一揽子计划 16 (网络编程、HTTP协议、iOS 实现网络编程、服务器接口)
- 网络编程之socket常用接口
- [Java] 【源码】新手初探java网络编程——socket接口实现简单的客户机/服务器程序
- 基于C++11模板元编程实现Scheme中的list及相关函数式编程接口