accept函数源码分析

我们在应用层调的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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值