为什么服务端程序都需要先 listen 一下?
时间:2021-09-22 14:19:01
手机看文章
扫描二维码
随时随地手机看文章
[导读]大家都知道,在创建一个服务器程序的时候,需要先listen一下,然后才能接收客户端的请求。例如下面的这段代码我们再熟悉不过了。int main(int argc, char const *argv[]){ int fd = socket(AF_INET, SOCK_STREAM,...
大家都知道,在创建一个服务器程序的时候,需要先 listen 一下,然后才能接收客户端的请求。例如下面的这段代码我们再熟悉不过了。
int main(int argc, char const *argv[])
{
int fd = socket(AF_INET, SOCK_STREAM, 0);
bind(fd, ...);
listen(fd, 128);
accept(fd, ...);
那么我们今天来思考一个问题,为什么需要 listen 一下才能接收连接?或者换句话说,listen 内部执行的时候到底干了啥?如果你也想搞清楚 listen 内部的这些秘密,那么请跟我来!一、创建 socket
服务器要做的第一件事就是先创建一个 socket。具体就是通过调用 socket 函数。当 socket 函数执行完毕后,在用户层视角我们是看到返回了一个文件描述符 fd。但在内核中其实是一套内核对象组合,大体结构如下。这里简单了解这个结构就行,后面我们在源码中看到函数指针调用的时候需要回头再来看它。二、内核执行 listen
2.1 listen 系统调用
我在 net/socket.c 下找到了 listen 系统调用的源码。//file: net/socket.c
SYSCALL_DEFINE2(listen, int, fd, int, backlog)
{
//根据 fd 查找 socket 内核对象
sock = sockfd_lookup_light(fd,