listen只是创建监听套接字,3路握手并不是由listen函数来完成的。
listen只做两件事:
1,将socket创建的主动(默认)套接字转换成被动套接字,指示内核接受指向该套接字的连接请求
2,指定内核应该为相应套接字排队的最大连接数
accept仅仅是从监听套接字队列中取出完成握手的连接套接字,至于阻塞的唤醒也是由内核自动完成的
accept取出套接字的队列存放的全是已经完成连接的套接字,对于监听套接字,一般会有两个队列,未完成连接套接字和已完成连接套接字,当请求到达时,新建套接字会被存放在未完成中,3路握手完毕就会被转移到已完成队列里,accept就是从已完成队列里取。这两个队列的维护和3路握手都是由内核自动完成,不需要服务器进程去插手