linux网络编程之用一张图片说明函数inet_ntop、inet_pton、inet_addr、inet_ntoa 、inet_aton函数之间的关系

来源:互联网 发布:如何从github下载源码 编辑:程序博客网 时间:2024/05/17 08:15

1、inet_ntop、inet_pton、inet_addr、inet_ntoa 、inet_aton函数之间的关系



2、inet_ntop、inet_pton函数的源代码


1、inet_pton函数源码

int inet_pton(int family, const char *strptr, void *addrptr){    if (family == AF_INET) {    struct in_addr  in_val;if (inet_aton(strptr, &in_val)) {    memcpy(addrptr, &in_val, sizeof(in_val));    return (1);}}errno = EAFNOSUPPOPT;return (-1);}


2、inet_ntop函数源码

const char *inet_ntop(int family, const void *addrptr, char *strptr, size_t len){const u_char *p = (const u_char*)addrptr;if (family == AF_INET) {char temp[INET_ADDRSTRLEN];snprintf(temp, sizeof(temp), "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);if (strlen(temp) >= len) {    errno = ENOSPC;    rturn (NULL);}strcpy(strptr, temp);return (strptr);}errno = EAFNOSUPPOPT;return (NULL);}





3、如果用inet_ntop、inet_pton替代inet_ntoa、和inet_addr函数

inet_pton(AF_INET, cp, &foo.sin_addr)代替下面函数foo.sin_addr.s_addr = inet_addr(cp);


char str[INET_ADDRSTRLEN];ptr = inet_ntop(AF_INET, &foo.sin_addr, str, sizeof(str));代替下面函数ptr =  inet_ntoa(foo.sin_addr);

注意inet_ntoa是静态函数,如果你打印2次,结果会一样,之前我们打印日志的时候,发现源地址和目标地址是一样的,这不日了狗吗?肯定不一样,所以切记,是个静态函数。


0 0
原创粉丝点击