inet_pton() 및 inet_ntop() 함수

https://blog.csdn.net/zyy617532750/article/details/58595700

1. 네트워크 전송을 위해 IP 주소를 바이너리 값으로 변환

int inet_aton(const char *cp, struct in_addr *inp);

inet_aton()은 네트워크 호스트 주소 ip(예: 192.168.1.10)를 바이너리 값으로 변환하여 struct in_addr 구조, 즉 두 번째 매개변수 *inp에 저장합니다. 이 함수는 cp 호스트가 유효함을 나타내기 위해 0이 아닌 값을 반환하고 호스트 주소가 유효하지 않음을 나타내기 위해 0을 반환합니다. (이 변환은 네트워크 전송에 사용할 수 없으며 호스트 바이트 순서를 네트워크 바이트 순서로 변환하려면 htons 또는 htonl 함수를 호출해야 합니다.)

 

in_addr_t inet_addr(const char *cp);

inet_addr 함수는 네트워크 호스트 주소(예: 192.168.1.10)를 네트워크 바이트 순서 이진 값으로 변환합니다. 매개 변수 char *cp가 유효하지 않은 경우 함수는 -1(INADDR_NONE)을 반환합니다. 이 함수는 주소가 255.255.255.255인 경우에도 -1을 반환합니다. 255.255.255.255는 유효한 주소이지만 inet_addr이 처리할 수 없습니다.

 

2. 네트워크를 통해 전송되는 바이너리 값을 점으로 구분된 십진수 IP 주소로 변환

char *inet_ntoa(struct in_addr in);

inet_ntoa 함수는 네트워크 바이트 정렬 주소를 표준 ASCII 점으로 구분된 주소로 변환합니다.이 함수는 점으로 구분된 문자열 주소(예: 192.168.1.10)에 대한 포인터를 반환합니다.문자열의 공간은 정적으로 할당됩니다. 즉, 함수가 두 번째로 호출될 때 마지막 호출을 덮어쓰게 됩니다(커버). 문자열을 저장해야 하는 경우 복사하여 직접 관리하십시오!

 

점으로 구분된 10진수 IP를 어떻게 출력합니까? 다음 프로그램을 살펴보자.

#include <stdio.h>   
#include <sys/socket.h>   
#include <netinet/in.h>   
#include <arpa/inet.h>   
#include <string.h>   
int main()   
{   
	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가 한 번만 실행된다는 것을 알 수 있습니다.  

192.168.0.74  

211.100.21.179  

inet_ntoa는 char *를 반환하고 이 char *의 공간은 inet_ntoa에 정적으로 할당되므로 inet_ntoa 이후의 호출은 마지막 호출을 덮어씁니다. printf의 첫 번째 문장의 결과는 printf의 가변 매개변수 평가가 오른쪽에서 왼쪽으로 진행된다는 것만 보여줄 수 있습니다.

 

3. 새로운 네트워크 주소 변환 함수 inet_pton과 inet_ntop
은 IPv6와 함께 등장하는 함수로 IPv4 주소와 IPv6 주소 모두에 적용할 수 있으며, p와 n은 각각 프리젠테이션과 숫자 값을 나타냅니다. 주소의 표현 형식은 일반적으로 ASCII 문자열이고 숫자 형식은 소켓 주소 구조에 저장된 이진 값입니다.

#include <arpe/inet.h>
int inet_pton(int family, const char *strptr, void *addrptr);     //将点分十进制的ip地址转化为用于网络传输的数值格式
        返回值:若成功则为1,若输入不是有效的表达式则为0,若出错则为-1
 
const char * inet_ntop(int family, const void *addrptr, char *strptr, size_t len);     //将数值格式转化为点分十进制的ip地址格式
        返回值:若成功则为指向结构的指针,若出错则为NULL

(1) 이 두 기능의 패밀리 매개변수는 AF_INET(ipv4) 또는 AF_INET6(ipv6)일 수 있습니다. 지원되지 않는 주소 패밀리가 family 인수로 제공되면 두 함수 모두 오류를 반환하고 errno를 EAFNOSUPPORT로 설정합니다.

(2) 첫 번째 함수는 strptr 포인터가 가리키는 문자열을 변환하려고 시도하고 addrptr 포인터를 통해 이진 결과를 저장합니다 성공하면 반환 값은 1이고, 그렇지 않으면 입력 문자열이 지정된 패밀리에 대해 유효한 표현식 형식이 아니면 반환 값은 0입니다.

(3) inet_ntop은 숫자 형식(addrptr)에서 표현식(strptr)으로 반대 변환을 수행합니다. inet_ntop 함수의 strptr 매개변수는 널 포인터일 수 없습니다. 호출자는 대상 저장 단위에 대한 메모리를 할당하고 해당 크기를 지정해야 합니다. 호출이 성공하면 이 포인터가 함수의 반환 값입니다. len 인수는 함수가 호출자의 버퍼를 오버플로하지 않도록 대상 메모리 단위의 크기입니다. len이 식의 결과를 담기에 너무 작으면 null 포인터가 반환되고 errno가 ENOSPC로 설정됩니다.

 

4. 예시

inet_pton(AF_INET, ip, &foo.sin_addr);   //  代替 foo.sin_addr.addr=inet_addr(ip);
 
 
char str[INET_ADDRSTRLEN];
char *ptr = inet_ntop(AF_INET,&foo.sin_addr, str, sizeof(str));      // 代替 ptr = inet_ntoa(foo.sin_addr)

 

Supongo que te gusta

Origin blog.csdn.net/mmk27_word/article/details/108325233
Recomendado
Clasificación