WEB开发网
开发学院软件开发Java tcp connection setup的实现(三) 阅读

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

可以看到流程很简单,最终的实现都集中在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; 
} 

上一页  1 2 3 4 5 6 7  下一页

Tags:tcp connection setup

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接