Chinaunix首页 | 论坛 | 博客
  • 博客访问: 301622
  • 博文数量: 94
  • 博客积分: 2163
  • 博客等级: 大尉
  • 技术积分: 932
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-20 09:23
文章存档

2012年(2)

2011年(92)

分类: LINUX

2011-10-13 16:14:38

  1. connect.c的struct address_list *al = lookup_host(host, 0)
  2. 调用的
  3. 在lookup_host()过程中
  4. /*
  5. 263 address_list_from_ipv4_addresses (char **vec)
  6. 设置ip地址,ip域,等*/
  7. /*
  8. 717           al = cache_query (host);
  9. 从cashe中寻找要访问的主机名称*/
  10. 65 struct addrinfo /*存储地址信息的结构体*/
  11. 66 {
  12. 67   int ai_flags;                 /* Input flags.  */
  13. 68   int ai_family;                /* Protocol family for socket.  */
  14. 69   int ai_socktype;              /* Socket type.  */
  15. 70   int ai_protocol;              /* Protocol for socket.  */
  16. 71   socklen_t ai_addrlen;         /* Length of socket address.  */
  17. 72   struct sockaddr *ai_addr;     /* Socket address for socket.  */
  18. 73   char *ai_canonname;           /* Canonical name for service location.  */
  19. 74   struct addrinfo *ai_next;     /* Pointer to next in list.  */
  20. 75 };  
  21. 372 struct gaiwt_context {
  22. 373   const char *node;
  23. 374   const char *service;
  24. 375   const struct addrinfo *hints;
  25. 376   struct addrinfo **res;
  26. 377   int exit_code;
  27. 378 };
复制代码
  1. /*是否运行超时
  2. err = getaddrinfo_with_timeout (host, NULL, &hints, &res, timeout);/timeout是规定的计时器*/
  3.      
  4. 2023   if (timeout == 0)
  5. 2024     {
  6. 2025       fun (arg);
  7. 2026       return false;
  8. 2027     }
  9. 2028
  10. 2029   signal (SIGALRM, abort_run_with_timeout);
  11. 1950 static void
  12. 1951 alarm_set (double timeout)
  13. 1952 {
  14. /*从新设置定时器,并且为addrinfo 类型的hints变量赋值,并且将端口也转化成host转化成inet格式*/
复制代码
  1. 从创建的addrinfo中创建address_list链表 al
  2.   al = address_list_from_addrinfo (res); 完成后,al中存储着所有的ip地址,其中ipv6和ipv4类型在函数中分开
  3. */
  4. 打印一些信息到logfp文件*/
复制代码
  1. 846   if (use_cache)
  2. 847     cache_store (host, al); /*根据host名存储到hash表,其中以host名字作为hash方程的hash元素,al存储到cell->value*/
复制代码
结束了*/
返回到
  1. connect_to_host()函数  
  2.   address_list_get_bounds (al, &start, &end); 获得边界*/
  3. 398   for (i = start; i < end; i++)
  4. 399     {
  5. 400       const ip_address *ip = address_list_address_at (al, i);
  6. 401       sock = connect_to_ip (ip, port, host); /*这个就开始连接网络*/
复制代码
  1. connect_to_ip()函数
  2. 00   sockaddr_set_data (sa, ip, port);  /*struct sockaddr 类型的======>1、________------->*/
  3. 301
  4. 302   
  5. 303   sock = socket (sa->sa_family, SOCK_STREAM, 0);  /*显然是面向TCP协议的,创建sock文件*/
  6. 304   if (sock < 0)
  7. 305     goto err;
复制代码
  1. ========================>
  2. struct sockaddr {
  3.   unsigned short sa_family; /* address family, AF_xxx */
  4.   char sa_data[14]; /* 14 bytes of protocol address */
  5.   };
  6.   sa_family是地址家族,一般都是“AF_xxx”的形式。好像通常大多用的是都是AF_INET。
  7.   sa_data是14字节协议地址。
  8. 但一般编程中并不直接针对此数据结构操作,而是使用另一个与sockaddr等价的数据结构
  9.   sockaddr_in(在netinet/in.h中定义):
  10.   struct sockaddr_in {
  11.   short int sin_family; /* Address family */
  12.   unsigned short int sin_port; /* Port number */
  13.   struct in_addr sin_addr; /* Internet address */
  14.   unsigned char sin_zero[8]; /* Same size as struct sockaddr */
  15.   };
复制代码
  1. 1、______________------------->
  2. 82 static void
  3. 83 sockaddr_set_data (struct sockaddr *sa, const ip_address *ip, int port)
  4. 84 {
  5. 85   switch (ip->family)
  6. 86     {
  7. 87     case AF_INET:
  8. 88       {
  9. 89         struct sockaddr_in *sin = (struct sockaddr_in *)sa;
  10. 90         xzero (*sin);
  11. 91         sin->sin_family = AF_INET;
  12. 92         sin->sin_port = htons (port);
  13. 93         sin->sin_addr = ip->data.d4;
  14. 94         break;
  15. 95       }
  16. 96 #ifdef ENABLE_IPV6
  17. 97     case AF_INET6:
  18. 98       {
  19. 99         struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sa;
  20. 100         xzero (*sin6);
  21. 101         sin6->sin6_family = AF_INET6;
  22. 102         sin6->sin6_port = htons (port);
  23. 103         sin6->sin6_addr = ip->data.d6;
  24. 104 #ifdef HAVE_SOCKADDR_IN6_SCOPE_ID
  25. 105         sin6->sin6_scope_id = ip->ipv6_scope;
  26. 106 #endif
  27. 107         break;
  28. 108       }
  29. 108       }
  30. 109 #endif /* ENABLE_IPV6 */
  31. 110     default:
  32. 111       abort ();
  33. 112     }
  34. 113 }
  35. 114
复制代码
[code]
接着就是
322   if (opt.limit_rate && opt.limit_rate < 8192)
323     {
324       int bufsize = opt.limit_rate;
设置buffer大小,至少为512字节*/
343           if (bind (sock, bind_sa, sockaddr_size (bind_sa)) < 0)
          /*这是给上面的sock文件编号,使之可以对应进行访问此sock文件*/
connect_with_timeout_________---------->230 connect_with_timeout_callback (void *arg)
231 {
232   struct cwt_context *ctx = (struct cwt_context *)arg;
233   ctx->result = connect (ctx->fd, ctx->addr, ctx->addrlen);
234 }
/*这就是开始连接了,伴随计时开始了*/
阅读(1737) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~