2017-09-17 11 views
-1

한다 getaddrinfo의 정의는()입니다 :getaddrinfo()가 함수의 입력 부분에 값을 반환하는 이유는 무엇입니까?

int getaddrinfo(const char *node,  // e.g. "www.example.com" or IP 
       const char *service, // e.g. "http" or port number 
       const struct addrinfo *hints, 
       struct addrinfo **res); 

당 Beej의 site는 말한다 :

", 당신은이 기능을 3 개 개의 입력 매개 변수를 제공하고, 링크 된 목록에 당신에게 포인터를 제공합니다 고해상도, 결과의. "

사용의 관점에서입니다

if ((rv = getaddrinfo(NULL, PORT, &hints, &servinfo)) != 0) { 
    fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv)); 
    return 1; 
} 

// loop through all the results and bind to the first we can 
for(p = servinfo; p != NULL; p = p->ai_next) { 
    if ((sockfd = socket(p->ai_family, p->ai_socktype, 
      p->ai_protocol)) == -1) { 
     perror("server: socket"); 
     continue; 
    } 

    if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, 
      sizeof(int)) == -1) { 
     perror("setsockopt"); 
     exit(1); 
    } 

    if (bind(sockfd, p->ai_addr, p->ai_addrlen) == -1) { 
     close(sockfd); 
     perror("server: bind"); 
     continue; 
    } 

    break; 
} 

실제 반환 값」rv는 "실제로 사용되지 않습니다. 그러나이 결과는 네 번째 입력 "res"또는 "servinfo"에서 가져옵니다. 연결된 목록이 관련되어 있음을 이해하지만 함수 반환이 정상적인 방식으로 작동하지 않는 이유는 분명하지 않습니다. "rv"가 주소를 얻기 위해 반복되는 배열이 아닌 이유는 무엇입니까? 입력이 결과를 반환하는 이유는 무엇입니까?

+2

매우 자세히 보면 'rv'가 실제로 두 번째 줄에 사용됩니다. 'gai_seterror'로 전달되면 오류 메시지를 사용자에게 형식화하여 호출이 실패한 이유를 나타냅니다. – selbie

+0

C *에서 참조로 패스를 에뮬레이션하는 방법에 대해 조사하십시오. –

+0

타사 사이트를 참조 용으로 사용할 수 없습니다. * man * page에 대한 의견을 나누셨습니까? – EJP

답변

2

rv입니다. 조작이 성공하면 0을, 실패하면 오류 코드를 포함합니다. 질문에서 제공 한 샘플 코드에 rv이 사용 된 것을 볼 수도 있습니다!

            // ↓ result is compared to 0 
if ((rv = getaddrinfo(NULL, PORT, &hints, &servinfo)) != 0) { 
    fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv)); 
                // ↑ error message based on rv 
    return 1; 
} 

C는 다중 반환 값이있는 함수를 지원하지 않습니다. 다중 출력을 갖는 getaddrinfo()과 같은 함수에서 적어도 하나의 출력은 포인터로 함수에 전달되어야합니다.

또는 구조가 getaddrinfo()의 결과를 포함하도록 정의되었을 수 있지만 약간 어색 할 것입니다.

1

함수가 코딩되는 방식은 함수가 성공적으로 실행되었는지 여부에 관계없이 반환 값이 상태 코드 일뿐입니다. 그런 다음 제공된 링크 목록 포인터에 더 복잡한 결과 집합이 채워집니다.

C에서 이와 같은 작업을하는 것은 드문 일이 아닙니다. ** res 표기법은 분명히 혼란 스럽지만, 함수에 java가 들어있는 빈 LinkedList 객체를주는 것과 같습니다.

요약하면 C에서 이것은 일반적이지 않습니다. 그리고 입력 값이 값이 아닌 참조/포인터로 전달되면 함수를 가져 오는 함수가 원하는 값으로 수행 할 수 있습니다. 그것은 다른 언어에서도 마찬가지입니다.