2014-04-28 2 views
0

C++로 작업 한 이후로 나이가 들어갔 기 때문에 기본 문제 일 수 있지만 솔루션을 찾을 수없는 것 같습니다.C++ 소켓 - strcutures 배열에서 단일 addrinfo 반환

주어진 호스트/포트에 대한 IP 주소를 조회 할 수있는 작은 C++ 소켓 클래스를 작성해야합니다. 구조체 배열에서 호출하는 함수에 하나의 addrinfo 구조체 (아래 줄을 표시했습니다)를 반환하는 방법을 모르겠지만 모든 것이 클래스 내부에서 올바르게 작동합니다. 나는 memcopy, 포인터 등을 시도했다. 아무 것도 작동하지 않는 것 같다.

Getaddrinfo는 주소 구조의 배열 (m_addList)을 반환합니다. 컴파일/실행하면 클래스 내의 결과가 반환 된 결과와 완전히 다릅니다. 간단히하기 위해 예제를 단순화했습니다.

./lookup www.stackoverflow.com 80 
=> 2 
=> 1 
-> 32767 
-> 4197087 

"->"값이 올바르지 않아 소켓 오류가 발생하지만 "=>"표시된 값이 정확하고 소켓을 생성하는 데 사용할 수 있습니다.

코드 : 도움을

#include <netdb.h> 
#include <arpa/inet.h> 
#include <string.h> 
#include <iostream> 
using namespace std; 

class getAddress 
{ 
private: 
    struct addrinfo *m_addList; // List of returned address info structures 
public: 
    int getAddressInfo(char* host, char* port, struct addrinfo singleAddress); 
}; 

int getAddress::getAddressInfo(char* host, char* port, struct addrinfo singleAddress) 
{ 
    int ret; 
    struct addrinfo addCriteria; 

    memset(&addCriteria, 0, sizeof(addCriteria)); 
    addCriteria.ai_family = AF_UNSPEC; 
    addCriteria.ai_socktype = SOCK_STREAM; 
    addCriteria.ai_protocol = IPPROTO_TCP; 

    ret = getaddrinfo(host, port, &addCriteria, &m_addList); 
    if (ret != 0) 
     return -1; 

    // Simply return the first address found 
    singleAddress = *m_addList;    // <---- This is my problem 
    cout << "=> " << singleAddress.ai_family << endl; 
    cout << "=> " << singleAddress.ai_socktype << endl; 

    return 0; 
} 

int main(int argc, char* argv[]) 
{ 
    int res; 
    struct addrinfo inVal; 

    if (argc < 3) 
     cout << "Usage: main [domain] [port]" << endl; 

    getAddress adObj; 
    res = adObj.getAddressInfo(argv[1], argv[2], inVal); 
    if (res == 0) 
    { 
     cout << "-> " << inVal.ai_family << endl; 
     cout << "-> " << inVal.ai_socktype << endl; 
    } 
} 

정말 고마워요!

+0

으로 아무것도하지 않고있다. SingleAddress에 할당 한 값은 모두 복사본에 할당됩니다. 소스는 inatct로 남게되므로 임의의 숫자가 표시됩니다. – alvits

답변

1
이 당신의 기능을 변경

:

int getAddress::getAddressInfo(char* host, char* port, struct addrinfo &singleAddress) 

는 지금, 당신은 당신은 값으로 세 번째 매개 변수를 전달하는 경우에만 singleAddress의 로컬 복사본을 수정하고, inVal

+0

함수 및 프로토 타입을 & singleAddress로 변경하여 완벽하게 작동했습니다. 도와 주셔서 감사합니다. – chris358

0
int getAddressInfo(char* host, char* port, struct addrinfo singleAddress); 

해당 함수에 전달 된 매개 변수의 값을 값으로 반환 할 수 없습니다. singleAddressgetAddressInfo의 로컬 변수입니다. 원하는대로 수정할 수 있지만 호출자는 아무 것도 볼 수 없습니다.

매개 변수를 참조/포인터로 전달하는 방법에 익숙해 져 있어야합니다.