tcp/ip中的 ip字符串转整数函数 inet_aton 源代码

  1. // ip地址结构体  
  2. struct in_addr  
  3. {  
  4.     unsigned int s_addr; // network byte order( big-endian)  
  5. };  
  6.   
  7. // inet_aton将 点分十进制串cp 转换为一个网络字节顺序的32位整数 IP地址  
  8. // 例如将串cp "192.168.33.123 "  
  9. // 转为 1100 0000   1010 1000    0010 0001     0111 1011   
  10. // 成功返回1,出错返回0  
  11. // 转换成功,结果保存在结构体指针ap中  
  12. int inet_aton(const char *cp, struct in_addr *ap)  
  13. {  
  14.     int dots = 0;  
  15.     register u_long acc = 0, addr = 0;  
  16.       
  17.     do {  
  18.   
  19.             register char cc = *cp;  
  20.           
  21.             switch (cc)   
  22.             {  
  23.                 case '0':  
  24.                 case '1':  
  25.                 case '2':  
  26.                 case '3':  
  27.                 case '4':  
  28.                 case '5':  
  29.                 case '6':  
  30.                 case '7':  
  31.                 case '8':  
  32.                 case '9':  
  33.                     acc = acc * 10 + (cc - '0');  
  34.                     break;  
  35.                       
  36.                 case '.':  
  37.                     if (++dots > 3)  
  38.                     {  
  39.                         return 0;  
  40.                     }  
  41.                     // Fall through  
  42.                       
  43.                 case '/0':  
  44.                     if (acc > 255)   
  45.                     {  
  46.                         return 0;  
  47.                     }  
  48.                     addr = addr << 8 | acc; // 这句是精华,每次将当前值左移八位加上后面的值  
  49.                     acc = 0;  
  50.                     break;  
  51.                       
  52.                 default:  
  53.                     return 0;  
  54.             }  
  55.   
  56.     } while (*cp++) ;  
  57.       
  58.     // Normalize the address   
  59.     if (dots < 3)  
  60.     {  
  61.         addr <<= 8 * (3 - dots) ;  
  62.     }  
  63.       
  64.     //Store it if requested   
  65.     if (ap)   
  66.     {  
  67.         ap->s_addr = htonl(addr);  
  68.     }  
  69.       
  70.     return 1;      
  71. }  
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值