#include <arpa/inet.h>
函数样式
struct
in_addr
{
in_addr_t s_addr;
};
结构体in_addr 用来表示一个32位的IPv4地址。
in_addr_t 一般为 32位的unsigned int,其字节顺序为网络顺序(network byte ordered),即该无符号整数采用大端字节序 。
其中每8位代表一个IP地址位中的一个数值。
例如192.168.3.144记为0xc0a80390,其中 c0 为192 ,a8 为 168, 03 为 3 , 90 为 144
打印的时候可以调用inet_ntoa()函数将其转换为char *类型。
- #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 : %s\n", inet_ntoa(addr1), inet_ntoa(addr2)); //注意这一句的运行结果
- printf("%s\n", inet_ntoa(addr1));
- printf("%s\n", inet_ntoa(addr2));
- return 0;
- }
#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 : %s\n", inet_ntoa(addr1), inet_ntoa(addr2)); //注意这一句的运行结果
printf("%s\n", inet_ntoa(addr1));
printf("%s\n", inet_ntoa(addr2));
return 0;
}
实际运行结果如下:
192.168.0.74 : 192.168.0.74 //从这里可以看出,printf里的inet_ntoa(addr2)先于inet_ntoa(addr1)执行。
192.168.0.74
211.100.21.179
inet_ntoa返回一个char *,而这个char *的空间是在inet_ntoa里面静态分配的,所以inet_ntoa后面的调用会覆盖上一次的调用。第一句printf的结果只能说明在printf里面的可变参数的求值是从右到左的,仅此而已。