linux环境socket编程中的inet_addr()和inet_ntoa()函数

HW_Coder0501 2017-02-27 08:50:55
两个函数的介绍如下:

in_addr_t inet_addr(const char *cp);
参数:字符串,一个点分十进制的IP地址。
返回值:如果正确执行将返回一个无符号长整数型数。如果传入的字符串不是一个合法的IP地址,将返回INADDR_NONE。
作用:将一个点分十进制的IP转换成一个长整数型数(u_long类型)。
如: inet_addr("127.0.0.1"); //将字符串形式的IP地址转换为按网络字节顺序的整型值


char * inet_ntoa(struct in_addr in);
参数:一个网络上的IP地址(注意,其参数为一结构)
返回值:如果正确,返回一个字符指针,指向一块存储着点分格式IP地址的静态缓冲区(同一线程内共享此内存);错误,返回NULL。
作用:将一个十进制网络字节序转换为点分十进制IP格式的字符串

我的问题:(1)此处指的字符串形式的IP地址、网络字节顺序的整型值、十进制网络字节序IP、点分十进制IP格式的字符串分别指什么?能否举个具体例子说明?
(2)有个例子如下:
#include <stdio.h>
  #include <sys/socket.h>
  #include <netinet/in.h>
  #include <arpa/inet.h>
  #include <string.h>
  int main(int argc, char *argv[])
  {
  struct in_addr addr1,addr2;
  ulong l1,l2;
  l1= inet_addr("192.168.0.74");
  l2 = inet_addr("211.100.21.179");
  memcpy(&addr1, &l1, 4);
  memcpy(&addr2, &l2, 4);
  printf("%s \n", inet_ntoa(addr1)); //注意这一句的运行结果
  printf("%s\n", inet_ntoa(addr1));
  printf("%s\n", inet_ntoa(addr2));
  return 0;
  }
运行结果:192.168.0.74
   192.168.0.74
   211.100.21.179
问题:(a) inet_ntoa*()的返回值应该是一个字符指针,但printf("%s\n", inet_ntoa(addr1)); 语句中为什么不是%p而是%s ?
(b) 此处192.168.0.74和211.100.21.179经函数 inet_ntoa()转化后输出结果没有改变,那么调用 inet_ntoa()的意义是什么?
...全文
7000 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 6 楼 q3733353520 的回复:
[quote=引用 5 楼 hhhlizhao 的回复:] [quote=引用 2 楼 q3733353520 的回复:] %p是指针的值即字符串首地址,%s输出整个字符串。 去看看printf函数的用法吧 inet_ntoa 将一个十进制网络字节序转换为点分十进制IP格式的字符串。 inet_addr 将一个点分十进制的IP转换成一个长整数型数 你把这2个函数分别执行了一次,就相当于回到原点
周六好。按照你的说法%s输出整个字符串,那printf("%s\n", inet_ntoa(addr1));   中 inet_ntoa(addr1)应该是一个字符串,但实际上 inet_ntoa()函数的返回值是一个指针,以192.168.0.74 为例,inet_ntoa()应该返回指向192.168.0.74 的指针啊?[/quote] 我说的返回字符串的意思就是返回指向这个字符串的首地址的指针[/quote] printf的基本用法,参数意义,自己去了解下吧。
  • 打赏
  • 举报
回复
引用 5 楼 hhhlizhao 的回复:
[quote=引用 2 楼 q3733353520 的回复:] %p是指针的值即字符串首地址,%s输出整个字符串。 去看看printf函数的用法吧 inet_ntoa 将一个十进制网络字节序转换为点分十进制IP格式的字符串。 inet_addr 将一个点分十进制的IP转换成一个长整数型数 你把这2个函数分别执行了一次,就相当于回到原点
周六好。按照你的说法%s输出整个字符串,那printf("%s\n", inet_ntoa(addr1));   中 inet_ntoa(addr1)应该是一个字符串,但实际上 inet_ntoa()函数的返回值是一个指针,以192.168.0.74 为例,inet_ntoa()应该返回指向192.168.0.74 的指针啊?[/quote] 我说的返回字符串的意思就是返回指向这个字符串的首地址的指针
HW_Coder0501 2017-03-03
  • 打赏
  • 举报
回复
引用 2 楼 q3733353520 的回复:
%p是指针的值即字符串首地址,%s输出整个字符串。 去看看printf函数的用法吧 inet_ntoa 将一个十进制网络字节序转换为点分十进制IP格式的字符串。 inet_addr 将一个点分十进制的IP转换成一个长整数型数 你把这2个函数分别执行了一次,就相当于回到原点
周六好。按照你的说法%s输出整个字符串,那printf("%s\n", inet_ntoa(addr1));   中 inet_ntoa(addr1)应该是一个字符串,但实际上 inet_ntoa()函数的返回值是一个指针,以192.168.0.74 为例,inet_ntoa()应该返回指向192.168.0.74 的指针啊?
HW_Coder0501 2017-03-03
  • 打赏
  • 举报
回复
引用 1 楼 twintiger 的回复:
char *是一个字符串啊,打印当然用%s,貌似printf里面有%p吗?如果你向知道指针的地址,可以%d或者%x打印。
有%p吧,代表指针。
twintiger 2017-02-28
  • 打赏
  • 举报
回复
char *是一个字符串啊,打印当然用%s,貌似printf里面有%p吗?如果你向知道指针的地址,可以%d或者%x打印。
  • 打赏
  • 举报
回复
%p是指针的值即字符串首地址,%s输出整个字符串。 去看看printf函数的用法吧 inet_ntoa 将一个十进制网络字节序转换为点分十进制IP格式的字符串。 inet_addr 将一个点分十进制的IP转换成一个长整数型数 你把这2个函数分别执行了一次,就相当于回到原点
nswcfd 2017-02-28
  • 打赏
  • 举报
回复
man inet_aton,会发现字符串形式的地址不仅仅包括a.b.c.d,还包括a.b.c、a.b、a等特殊的形式。

23,214

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧