자세히 inetpton()과 inetntop()함수

inet_pton 은 IP 주소 변환 함수 로 IP 주 소 를'점 10 진법'과'이 진 정수'사이 에서 변환 할 수 있 으 며 inetpton 과 inetntop 이 두 함 수 는 ipv 4 와 ipv 6 를 처리 할 수 있 습 니 다.비교적 새로운 함수 라 고 할 수 있다.
1.ip 주 소 를 네트워크 전송 에 사용 할 바 이 너 리 수치 로 변환 합 니 다.

int inet_aton(const char *cp, struct in_addr *inp);
inet_aton()네트워크 호스트 주소 ip(예 를 들 어 192.168.1.10)을 바 이 너 리 수치 로 바 꾸 고 struct in 에 저장 합 니 다.addr 구조 에서 두 번 째 매개 변수*inp,함수 반환 비 0 은 cp 호스트 가 유효 하 다 는 것 을 나타 내 고 0 을 되 돌려 주 는 것 은 호스트 주소 가 유효 하지 않다 는 것 을 나타 낸다.(이 변환 이 끝 난 후 네트워크 전송 에 사용 할 수 없습니다.htons 나 htonl 함 수 를 호출 해 야 호스트 바이트 순 서 를 네트워크 바이트 순서 로 바 꿀 수 있 습 니 다)

in_addr_t inet_addr(const char *cp);
inet_addr 함수 가 네트워크 호스트 주소(예:192.168.1.10)를 네트워크 바이트 순서 바 이 너 리 값 으로 변환 합 니 다.매개 변수 char*cp 가 잘못 되면 함수 반환-1(INADDRNONE),이 함 수 는 처리 주소 가 255.255.255.255.255 일 때 도 되 돌아 갑 니 다-1,255.255.255.255.255.255 는 유효한 주소 이지 만 inetaddr 처리 할 수 없 음;
2.네트워크 전송 의 바 이 너 리 수 치 를 점 10 진 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
", inet_ntoa(addr1), inet_ntoa(addr2)); // printf("%s
", inet_ntoa(addr1)); printf("%s
", inet_ntoa(addr2)); return 0; }
실제 운행 결 과 는 다음 과 같다.
192.168.0.74 : 192.168.0.74          //여기 서 보 듯 이 printf 의 inetntoa 는 한 번 만 실 행 했 습 니 다.  
192.168.0.74  
211.100.21.179  
inet_ntoa 는 char*를 되 돌려 줍 니 다.이 char*의 공간 은 inet 입 니 다.ntoa 에서 정적 으로 분 배 된,그래서 inetntoa 뒤의 호출 은 지난번 호출 을 덮어 씁 니 다.첫 번 째 printf 의 결 과 는 printf 에 있 는 가 변 매개 변수의 값 이 오른쪽 에서 왼쪽으로 구 하 는 것 임 을 설명 할 수 있 을 뿐 입 니 다.
3.신형 네트워크 주소 전환 함수 inetpton 과 inetntop
이 두 함 수 는 IPv 6 에 따라 나타 나 는 함수 로 IPv 4 주소 와 IPv 6 주소 에 모두 적용 되 며 함수 중 p 와 n 은 각각 표현(presentation)과 수치(numeric)를 대표 합 니 다.주소 의 표현 형식 은 보통 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)이 두 함수 의 family 인 자 는 AF 일 수도 있 습 니 다.INET(ipv 4)도 AFINET6(ipv6)。지원 되 지 않 는 주소 족 을 family 매개 변수 로 한다 면 이 두 함수 모두 오 류 를 되 돌려 주 고 errno 를 EAFNOSPPORT 로 설정 합 니 다.
(2)첫 번 째 함 수 는 strptr 포인터 가 가리 키 는 문자열 을 변환 하고 addrptr 포인터 로 바 이 너 리 결 과 를 저장 합 니 다.성공 하면 값 을 1 로 되 돌려 줍 니 다.그렇지 않 으 면 지정 한 family 에 입력 문자열 이 올 바른 표현 식 형식 이 아니라면 반환 값 은 0 입 니 다.
(3)inet_ntop 는 수치 형식(addrptr)에서 표현 식(strptr)으로 상 반 된 변환 을 진행 합 니 다.inet_ntop 함수 의 strptr 인 자 는 빈 포인터 가 될 수 없습니다.호출 자 는 대상 저장 소 에 메모 리 를 할당 하고 크기 를 지정 해 야 합 니 다.호출 이 성공 할 때 이 지침 은 이 함수 의 반환 값 입 니 다.len 매개 변 수 는 호출 자의 버퍼 가 넘 치지 않도록 대상 저장 장치 의 크기 입 니 다.len 이 너무 작 아서 표현 식 결 과 를 수용 할 수 없다 면 빈 지침 을 되 돌려 주 고 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)
총결산
위 에서 말 한 것 은 편집장 이 소개 해 준 inet 입 니 다.pton()과 inetntop()함수,여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 면 메 시 지 를 남 겨 주세요.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
만약 당신 이 본문 이 당신 에 게 도움 이 된다 고 생각한다 면,전 재 를 환영 합 니 다.번 거 로 우 시 겠 지만 출처 를 밝 혀 주 십시오.감사합니다!

좋은 웹페이지 즐겨찾기