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

tcp connection setup的实现(一)

 2009-09-10 00:00:00 来源:WEB开发网   
核心提示: struct inet_ehash_bucket管理所有的tcp状态在TCP_ESTABLISHED和TCP_CLOSE之间的socket.这里要注意,twchain表示处于TIME_WAIT的socket. Java代码 structinet_ehash_bucket{structhlist_

struct inet_ehash_bucket管理所有的tcp状态在TCP_ESTABLISHED和TCP_CLOSE之间的socket.这里要注意,twchain表示处于TIME_WAIT的socket.

Java代码

struct inet_ehash_bucket { 
 struct hlist_head chain; 
 struct hlist_head twchain; 
};

inet_bind_bucket结构就是每个使用的端口的信息,最终会把它链接到bhash链表中.

Java代码   

struct inet_bind_bucket { 
 struct net *ib_net; 
///端口号 
 unsigned short port; 
///表示这个端口是否能够被重复使用. 
 signed short fastreuse; 
///指向下一个端口的inet_bind_bucket 结构. 
 struct hlist_node node; 
///也就是使用这个端口的socket链表 
 struct hlist_head owners; 
};

最后一个结构是tcp_hashinfo他在 tcp_init中被初始化,而tcp_init是在inet_init中被初始化的.然后tcp_hashinfo会被赋值给tcp_proto和sock的sk_prot域.

Java代码  

struct inet_hashinfo __cacheline_aligned tcp_hashinfo = { 
 .lhash_lock = __RW_LOCK_UNLOCKED(tcp_hashinfo.lhash_lock), 
 .lhash_users = ATOMIC_INIT(0), 
 .lhash_wait = __WAIT_QUEUE_HEAD_INITIALIZER(tcp_hashinfo.lhash_wait), 
};

然后来看bind的实现,bind对应的系统调用是sys_bind:

Java代码

asmlinkage long sys_bind(int fd, struct sockaddr __user *umyaddr, int addrlen) 
{ 
 struct socket *sock; 
 struct sockaddr_storage address; 
 int err, fput_needed; 
 
///通过fd查找相应的socket,如果不存在则返回错误. 
 sock = sockfd_lookup_light(fd, &err, &fput_needed); 
 if (sock) { 
///用户空间和内核的地址拷贝. 
 err = move_addr_to_kernel(umyaddr, addrlen, (struct sockaddr *)&address); 
 if (err >= 0) { 
  err = security_socket_bind(sock, 
     (struct sockaddr *)&address, 
     addrlen); 
  if (!err) 
///调用inet_bind方法. 
  err = sock->ops->bind(sock, 
      (struct sockaddr *) 
      &address, addrlen); 
 } 
///将socket对应的file结构的引用计数. 
 fput_light(sock->file, fput_needed); 
 } 
 return err; 
}

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

Tags:tcp connection setup

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