tcp connection setup的实现(三)
2009-09-10 00:00:00 来源:WEB开发网可以看到流程很简单,最终的实现都集中在inet_accept中了.而inet_accept主要做的就是
1 调用inet_csk_accept来进行对accept队列的操作.它会返回取得的sock.
2 将从inet_csk_accept返回的sock链接到传递进来的(也就是在do_accept中new的socket)中.这里就知道我们上面为什么只需要new一个socket而不是sock了.因为sock我们是直接从accept队列中取得的.
3 设置新的socket的状态为SS_CONNECTED.
Java代码
int inet_accept(struct socket *sock, struct socket *newsock, int flags)
{
struct sock *sk1 = sock->sk;
int err = -EINVAL;
///调用inet_csk_accept.
struct sock *sk2 = sk1->sk_prot->accept(sk1, flags, &err);
if (!sk2)
goto do_err;
lock_sock(sk2);
///测试tcp连接的状态.
WARN_ON(!((1 << sk2->sk_state) &
(TCPF_ESTABLISHED | TCPF_CLOSE_WAIT | TCPF_CLOSE)));
///将返回的sock链接到socket.
sock_graft(sk2, newsock);
///设置状态.
newsock->state = SS_CONNECTED;
err = 0;
release_sock(sk2);
do_err:
return err;
}
inet_csk_accept就是从accept队列中取出sock然后返回.
在看他的源码之前先来看几个相关函数的实现:
首先是reqsk_queue_empty,他用来判断accept队列是否为空:
Java代码 static inline int reqsk_queue_empty(struct request_sock_queue *queue)
{
return queue->rskq_accept_head == NULL;
}
Tags:tcp connection setup
编辑录入:爽爽 [复制链接] [打 印]更多精彩
赞助商链接