linux环境socket编程中的inet_addr()和inet_ntoa()函数
两个函数的介绍如下:
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()的意义是什么?