我们在应用层调的accept函数。在调用这个函数之前我们先拿到socket和sock两个互相关联的结构体,底层执行顺序
1 执行socket.c的sock_accept,分配一个新的socket结构体和sock结构体,并且互相引用。
2 调用af_inet.c的inet_accept函数
3 调用tcp.c的tcp_accept函数,该函数遍历sock的receive_queue队列,该队列保存已经建立连接的节点。有的话执行返回。否则阻塞在sock结构体的sleep队列上。等待唤醒。
4 客户端发送syn包到服务器,执行tcp.c的tcp_rcv进行接收,执行tcp_conn_request新建一个sock结构体,把listen状态对应的sock结构体的数据复制过来。修改状态为TCP_SYN_RECV,判断listen的队列是否已经达到上限,发送ack包,最后把这次收到的syn包数据保存到receive_queue队列。
5 客户端发送ack包到服务器,执行tcp.c的tcp_rcv进行接收,然后执行tcp_ack函数,设置该数据包对应的sock结构体状态为TCP_ESTABLISHED,执行af_inet.c的def_callback1函数唤醒sock->sleep队列里的进程。
6 回到第3步,再次进入tcp_accept里的while循环,从队列里获取一个节点返回给上层,修改状态为SS_CONNECTED。
accept函数源码分析
最新推荐文章于 2024-03-04 16:22:32 发布