调用头文件:
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
函数原型:
转换字符串到网络地址
int inet_pton(int af, const char *src, void *dst);
转换网络地址到字符串
const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt);
参数解析:
af是地址族,inet_pton 是inet_addr的扩展,支持的多地址族有下列:
AF_INET:src为指向字符型的地址,即ASCII的地址的首地址(ddd.ddd.ddd.ddd格式的),函数将该地址转换为in_addr的结构体,并复制在*dst中
AF_INET6:src为指向IPv6的地址,,函数将该地址转换为in6_addr的结构体,并复制在*dst中
socklen_t cnt, 所指向缓存区dst的大小。
返回值:
如果函数出错将返回一个负值,并将errno设置为EAFNOSUPPORT,如果参数af指定的地址族和src格式不对,函数将返回0。
代码示例:
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
int main()
{
#if 0
char IPdotdec[20];
struct in_addr s;
printf("Please input IP address: ");
scanf("%s", &IPdotdec);
inet_pton(AF_INET, IPdotdec, (void *)&s);
printf("inet_pton: 0x%x\n", s.s_addr);
s.s_addr = ntohl(s.s_addr);
printf("inet_pton: 0x%x\n", s.s_addr);
s.s_addr = s.s_addr & 0xffff0000;
printf("inet_pton: 0x%x\n", s.s_addr);
s.s_addr = htonl(s.s_addr);
inet_ntop(AF_INET, (void *)&s, IPdotdec, 16);
printf("inet_ntop: %s\n", IPdotdec);
#else
char IPdotdec[40];
struct in6_addr s;
printf("Please input IP address: ");
scanf("%s", &IPdotdec);
inet_pton(AF_INET6, IPdotdec, (void *)&s);
printf("inet_pton: ");
int i;
for(i = 0; i < 16; i++)
{
printf("0x%x ", s.s6_addr[i]);
}
printf("\n");
inet_ntop(AF_INET6, (void *)&s, IPdotdec, 40);
printf("inet_ntop: %s\n", IPdotdec);
#endif
return 0;
}