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

tcp connection setup的实现(三)

 2009-09-10 00:00:00 来源:WEB开发网   
核心提示: 3 如果状态合适并且socket为阻塞模式则调用inet_wait_for_connect进入休眠等待握手完成,否则直接返回,并设置错误号为EINPROGRESS. Java代码 intinet_stream_connect(structsocket*sock,structsockaddr*ua

3 如果状态合适并且socket为阻塞模式则调用inet_wait_for_connect进入休眠等待握手完成,否则直接返回,并设置错误号为EINPROGRESS.

Java代码 int inet_stream_connect(struct socket *sock, struct sockaddr *uaddr, 
  int addr_len, int flags) 
{ 
 struct sock *sk = sock->sk; 
 int err; 
 long timeo; 
 
 lock_sock(sk); 
............................................ 
 
 switch (sock->state) { 
 default: 
 err = -EINVAL; 
 goto out; 
 case SS_CONNECTED: 
 err = -EISCONN; 
 goto out; 
 case SS_CONNECTING: 
 err = -EALREADY; 
 /* Fall out of switch with err, set for this state */ 
 break; 
 case SS_UNCONNECTED: 
 err = -EISCONN; 
 if (sk->sk_state != TCP_CLOSE) 
  goto out; 
///调用tcp_v4_connect来处理连接.主要是发送syn. 
 err = sk->sk_prot->connect(sk, uaddr, addr_len); 
 if (err < 0) 
  goto out; 
///设置状态. 
 sock->state = SS_CONNECTING; 
///设置错误号. 
 err = -EINPROGRESS; 
 break; 
 } 
///和上面的处理一样,如果非阻塞返回0,否则返回timeo. 
 timeo = sock_sndtimeo(sk, flags & O_NONBLOCK); 
 
 if ((1 << sk->sk_state) & (TCPF_SYN_SENT | TCPF_SYN_RECV)) { 
///如果非阻塞则直接返回.否则进入休眠等待三次握手完成并唤醒他.(这个函数和上面的inet_csk_wait_for_connect函数实现很类似,因此这里就不分析了) 
 if (!timeo || !inet_wait_for_connect(sk, timeo)) 
  goto out; 
 
 err = sock_intr_errno(timeo); 
 if (signal_pending(current)) 
  goto out; 
 } 
 
 /* Connection was closed by RST, timeout, ICMP error 
 * or another process disconnected us. 
 */ 
 if (sk->sk_state == TCP_CLOSE) 
 goto sock_error; 
///设置socket状态.为已连接. 
 sock->state = SS_CONNECTED; 
 err = 0; 
out: 
 release_sock(sk); 
 return err; 
 
sock_error: 
 err = sock_error(sk) ? : -ECONNABORTED; 
 sock->state = SS_UNCONNECTED; 
 if (sk->sk_prot->disconnect(sk, flags)) 
 sock->state = SS_DISCONNECTING; 
 goto out; 
}

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

Tags:tcp connection setup

编辑录入:爽爽 [复制链接] [打 印]
[]
  • 好
  • 好的评价 如果觉得好,就请您
      0%(0)
  • 差
  • 差的评价 如果觉得差,就请您
      0%(0)
赞助商链接