2013-11-23 1 views
0

원본의 IP를 찾으려고하는데 작동하지 않습니다.gethostbyname()이 작동하지 않습니다.

void getSourceIp(struct hostent *sourceHost, struct ip *ipStruct) 
{ 
    char sourceName[100]; 

    if (gethostname(sourceName,sizeof(sourceName)) < 0) 
    { 
     perror("Error in function gethostname().\n"); 
     exit(EXIT_FAILURE); 
    } 

    if ((sourceHost = gethostbyname(sourceName)) == NULL) 
    { 
     std::cout << "The source " << sourceName << " is unknown.\n"; 
     exit(EXIT_FAILURE); 
    } 

    ipStruct->ip_src = (*(struct in_addr *) sourceHost->h_addr_list); 
    std::cout << "IP Address: " << inet_ntoa(ipStruct->ip_src); 
} 

주요 기능 : 내가 얻을 출력은

int main(int argc, char *argv[]) 
{ 
    struct hostent *sourceHostent  = NULL; 
    struct hostent *destinationHostent = NULL; 
    struct ip *ip      = NULL; 

    getSourceIp(sourceHostent,ip); 
    return 0; 
} 

"소스 맥북 알 수 없습니다."

+1

"gethostbyname() not working"- 아마도 그렇 겠지만 기대치가 그 행동과 일치하지 않습니다. –

+0

무엇을 의미합니까? @ H2CO3 – Teodora

+0

죄송합니다. 내 의견을 마치고 깜빡 ...>. <바보 같이. –

답변

2

질문에 대한 의견에서 언급했듯이 방법에는 몇 가지 문제가 있습니다. 첫 번째는 결과가 호출 함수로 전달되지 않는다는 것입니다. 이 작업을 수행하려면 이중 포인터를 사용해야합니다.

다음으로 gethostbyname에서 반환 된 값은 정적 메모리에 할당되므로 다음에이 함수를 호출 할 때 덮어 쓸 수 있습니다. 결과를 자신의 메모리에 복사해야합니다. malloc(sizeof(struct hosting))뿐만 아니라 딥 카피해야하기 때문에 이것은 사소한 일입니다. 이 작업을 수행하는 것이 복잡한 이유는 gethostbyname이 가치가 떨어지는 이유입니다. 대상 플랫폼에 따라 DNS 조회를 수행하는 데 훨씬 좋은 옵션이 있습니다.

코드에서 조회가 성공하더라도 SEGFAULT가 표시됩니다. ipStructNULL 값을 전달한 후 역 참조를 시도하여 쓰기를 시도합니다. 당신이 NULL 포인터를 역 참조한다면, 당신은 나쁜 시간을 가질 것입니다. mallocfree을 사용하여 C에서 메모리 관리를 이해하는 데 시간을 할애해야합니다.

코드가 더 이상 표시되지 않고 사용자가 struct ip으로 무엇을하려고하는지 잘 모르겠습니다. 호스트의 IP 주소 중 하나 이상을 char * (으)로 설정하려고 시도했지만 대상을 상당 부분 놓친 것 같습니다. 당신이 의도를 상세히 설명 할 수 있다면 좀 더 많은 도움을 드릴 수 있습니다.

이 마지막 부분은 문체이지만 if 문에서 지정을하면 오류가 발생하기 쉽고 일반적으로 나쁜 생각입니다. 당신은 습관을 버려야합니다.

+0

ping을 구현하려고합니다. 원본 및 대상 IP 주소를 가져와 ICMP 에코 요청을 보내야합니다. 정말 고맙습니다. 아, 맥북을 사용하고 있습니다. – Teodora

+0

Ping을 구현하는 이유는 무엇입니까? 그것은 이미 존재합니다. 당신이 다르게하려고 시도하고있는 것이 있습니까? 아니면 이것은 학습 연습입니까? 학습 과제 인 경우 해결책 (UI, 라이브러리 사용 가능, 지원 플랫폼 등)에 대한 제약 조건은 무엇입니까? – Holly

+0

내 컴퓨터 네트워크의 숙제입니다. 사용 가능한 라이브러리는 C/C++의 것들이며, 지금은 내 Mac에서 작동해야합니다. – Teodora

관련 문제