2017-12-25 32 views
0

나는 다른 결과를 보여주는 예를 의아하게 여깁니다. 나에게 어딘가 잘못된 것입니까?inet_ntoa는 어떻게 되었습니까?

#include <stdio.h> 
#include <string.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 


int main(){ 
    struct sockaddr_in src; 
    struct sockaddr_in dest; 

    memset(&src, 0, sizeof(src)); 
    src.sin_addr.s_addr = 0xEBAE277D; 

    memset(&dest, 0, sizeof(dest)); 
    dest.sin_addr.s_addr = 0x6700A8C0; 

    printf("saddr:%s\n", inet_ntoa(src.sin_addr)); 
    printf("daddr:%s\n", inet_ntoa(dest.sin_addr)); 
    printf("src:%15s------->dest:%15s\n", inet_ntoa(src.sin_addr), inet_ntoa(dest.sin_addr)); 
} 

결과 :

saddr:125.39.174.235 
daddr:192.168.0.103 
src: 125.39.174.235------->dest: 125.39.174.235 
+0

여기에 무슨 문제가 있습니까? – Carcigenicate

+0

"src : 125.39.174.235 -------> dest : 125.39.174.235"의 결과가 맞습니까? –

답변

1

inet_ntoa 설명서에 말한다

inet_ntoa() 함수는 문자열 네트워크 바이트 순서로 주어진 인터넷 호스트 주소를 변환 IPv4 점으로 구분 된 10 진수 표기법. 문자열은 정적으로 할당 된 버퍼에 반환되며 이후의 호출은이를 덮어 씁니다.

(즉, 리눅스 man 페이지에서의, 다른 사람들이 서로 다른 표현을 가지고 있지만 정적 버퍼에 대한 경고가 어딘가가 있어야한다)

그래서 한 번 inet_ntoa라고 버퍼가 가득하고 포인터되었다 그것은 돌아왔다. 당신은 그것을 다시 불렀고, 버퍼는 덮어 쓰여졌고, 그것에 대한 포인터가 다시 리턴되었습니다. 두 포인터를 printf에 전달하면 버퍼 내용이 두 번 인쇄됩니다.

이 작업을 제대로 수행하려면 다시 호출하기 전에 inet_ntoa 결과를 로컬 버퍼에 복사하거나 2 printf을 사용해야합니다.

대신 출력 버퍼를 직접 제공해야하므로 inet_ntop을 사용할 수 있습니다. (호출자가 제공하는 출력 버퍼는 최신 인터페이스에서 더 일반적이며, 정적 출력 버퍼는 처음에는 쉽지만 코드에서와 같이 사고가 발생할 수 있습니다.)

+0

Nices, 대단히 감사합니다. –