免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 15675 | 回复: 6
打印 上一主题 下一主题

[C] linux 内核中将整数IP转换为字符串 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-04-10 14:05 |只看该作者 |倒序浏览
hi,all
linux 内核中有将整数IP转换为字符串的函数么?我知道应用层有个inet_aton(),但在内核中用不了。
我在linux内核代码ipv4目录里没找到想关的函数,水平有限。。汗。。
各位知道有哪个函数可以完成这一功能的么?

论坛徽章:
0
2 [报告]
发表于 2011-04-10 14:09 |只看该作者
inet_ntop()
inet_pton()

论坛徽章:
0
3 [报告]
发表于 2011-04-10 14:24 |只看该作者
inet_ntop()
inet_pton()
DNFCF 发表于 2011-04-10 14:09


谢谢。
    这两个也是在应用层用的,只是多了处理ipv6的功能。

论坛徽章:
0
4 [报告]
发表于 2011-04-10 14:37 |只看该作者
找到了两个实现,在sys/libkern/inet_ntoa.c 中,
http://fxr.watson.org/fxr/source/libkern/inet_ntoa.c?v=FREEBSD6

  1. #include <sys/cdefs.h>
  2.    31 __FBSDID("$FreeBSD$");
  3.    32
  4.    33 #include <sys/param.h>
  5.    34 #include <sys/systm.h>
  6.    35
  7.    36 #include <netinet/in.h>
  8.    37
  9.    38 char *
  10.    39 inet_ntoa(struct in_addr ina)
  11.    40 {
  12.    41         static char buf[4*sizeof "123"];
  13.    42         unsigned char *ucp = (unsigned char *)&ina;
  14.    43
  15.    44         sprintf(buf, "%d.%d.%d.%d",
  16.    45                 ucp[0] & 0xff,
  17.    46                 ucp[1] & 0xff,
  18.    47                 ucp[2] & 0xff,
  19.    48                 ucp[3] & 0xff);
  20.    49         return buf;
  21.    50 }
  22.    51
  23.    52 char *
  24.    53 inet_ntoa_r(struct in_addr ina, char *buf)
  25.    54 {
  26.    55         unsigned char *ucp = (unsigned char *)&ina;
  27.    56
  28.    57         sprintf(buf, "%d.%d.%d.%d",
  29.    58                 ucp[0] & 0xff,
  30.    59                 ucp[1] & 0xff,
  31.    60                 ucp[2] & 0xff,
  32.    61                 ucp[3] & 0xff);
  33.    62         return buf;
  34.    63 }

复制代码
另外一个
http://fxr.watson.org/fxr/source/libkern/inet_ntoa.c?v=DFBSD
多了个kprintf,还是直接用上面的sprintf的吧。

  1. #include <sys/param.h>
  2.    35 #include <sys/systm.h>
  3.    36
  4.    37 #include <netinet/in.h>
  5.    38
  6.    39 char *
  7.    40 inet_ntoa(struct in_addr ina)
  8.    41 {
  9.    42         static char buf[sizeof "aaa.bbb.ccc.ddd"];
  10.    43         unsigned char *ucp = (unsigned char *)&ina;
  11.    44
  12.    45         ksprintf(buf, "%d.%d.%d.%d",
  13.    46                  ucp[0] & 0xff,
  14.    47                  ucp[1] & 0xff,
  15.    48                  ucp[2] & 0xff,
  16.    49                  ucp[3] & 0xff);
  17.    50         return buf;
  18.    51 }

复制代码
:wink:

论坛徽章:
0
5 [报告]
发表于 2011-04-10 14:51 |只看该作者
上面的参数
struct in_addr ina
其实是这样的:
   struct in_addr {
           in_addr_t s_addr;
   };
---------------------------------------------》
typedef uint32_t                in_addr_t;

其实就是个unsigned int,直接传个整数就得了。。
嘿,在这里作一下记录了,以备后用。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
6 [报告]
发表于 2011-04-11 09:46 |只看该作者
这个自己实现起来也不难吧?!

论坛徽章:
0
7 [报告]
发表于 2011-04-11 22:04 |只看该作者
这个自己实现起来也不难吧?!
dwl301 发表于 2011-04-11 09:46



   没看源码之前,我也自己实现了,但就是很不放心啊,没信心。。
但看源码后,也就那么回事,嘿嘿。。掌握了便简单了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP