Chinaunix首页 | 论坛 | 博客
  • 博客访问: 112424
  • 博文数量: 24
  • 博客积分: 1335
  • 博客等级: 中尉
  • 技术积分: 415
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-25 10:07
文章分类
文章存档

2011年(22)

2010年(2)

分类: 系统运维

2011-06-30 01:01:26

转自:http://hi.baidu.com/amy_yeni/blog/item/a6928f2ba552ee305343c1bf.html
网络连接

      4.1 连接的建立和关闭

             tcp连接建立的代码如下:

                     server=gethostbyname(SERVER_NAME);

                     sockfd=socket(AF_INET,SOCK_STREAM,0);

                     address.sin_family=AF_INET

                     address.sin_port=htons(PORT_NUM);

                     memcpy(&address.sin_addr,server->h_addr,server->h_length);

                     connect(sockfd,&address,sizeof(address));

       连接的初始化与建立期间主要发生的事情如下:

                      

        1sys_socket调用:调用socket_creat(),创建出一个满足传入参数familytype、和protocolsocket,调用sock_map_fd()获取一个未被使用的文件描述符,并且申请并初始化对应的file{}结构。

        

        2sock_creat():创建socket结构,针对每种不同的familysocket结构的初始化,就需要调用不同的create函数来完成。对应于inet类型的地址来说,在网络协议初始化时调用sock_register()函数中完成注册的定义如下:

         struct net_proto_family inet_family_ops={

                 PF_INET;

                 inet_create

         };所以inet协议最后会调用inet_create函数。

        

        3inet_create: 初始化sock的状态设置为SS_UNCONNECTED,申请一个新的sock结构,并且初始化socket的成员ops初始化为inet_stream_ops,sock的成员prot初始化为tcp_prot。然后调用sock_init_data,将该socket结构的变量socksock类型的变量关联起来。

        4)在系统初始化完毕后便是进行connect的工作,系统调用connect将一个和socket结构关联的文件描述符和一个sockaddr{}结构的地址对应的远程机器相关联,并且调用各个协议自己对应的connect连接函数。对应于tcp类型,则sock->ops->connect便为inet_stream_connect

        5inet_stream_connect: 得到sk,sk=sock->sk,锁定sk,对自动获取sk的端口号存放在sk->num中,并且用htons()函数转换存放在sk->sport中。然后调用sk->prot->connect()函数指针,对tcp协议来说就是tcp_v4_connect()函数。然后将sock->state状态字设置为SS_CONNECTING,等待后面一系列的处理完成之后,就将状态改成SS_CONNECTTED

        6) tcp_v4_connect():调用函数ip_route_connect(),寻找合适的路由存放在rt中。ip_route_connect找两次,第一次找到下一跳的ip地址,在路由缓存或fib中找到,然后第二次找到下一跳的具体邻居,到neigh_table中找到。然后申请出tcp头的空间存放在buff中。将sk中相关地址数据做一些针对路由的变动,并且初始化一个tcp连接的序列号,调用函数tcp_connect(),初始化tcp头,并设置tcp处理需要的定时器。一次connect()建立的过程就结束了。

阅读(1503) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~