2012-08-06 2 views
1

이 코드는 Windows에서 정상적으로 작동하지만 gethostbyaddr은 Linux에서 NULL을 반환합니다.gethostbyaddr는 Windows에서는 정상이지만 Linux에서는 NULL을 반환합니다.

나는 많은 변화를 시도했지만 성공하지 못했습니다.

내 /etc/host.conf 파일은 다음 줄을

위해 호스트의 주소를 확인하고 잘 작동 gethostbyaddr를 창에 주소 11.234.456.74, 을

나는 전체 코드를 실행 바인딩하고 통과 있습니다. 그러나 Linux에서는 ip 주소를 확인하지 않고 NULL을 반환합니다.

도와주세요.

#ifdef WIN32 
if (init){ 
    WSADATA wsaData; 
    // Request Winsock version 2.2 
    if (WSAStartup (MAKEWORD(1, 1), &wsaData) != 0) { 
     WSACleanup(); 
     exit (EXIT_FAILURE); 
    } 
    init = 0; 
} 
#endif 

// Open required socket 
p_socket[IP_SOCKET_SOCKET] = socket(AF_INET, server_socket_type, 0); 
if (p_socket[IP_SOCKET_SOCKET] < 0) { 
#ifdef WIN32 
    WSACleanup(); 
#endif 
    exit (EXIT_FAILURE); 
} 
destAdrLen = mxGetM(prhs[0]) * mxGetN(prhs[0]) + 1; 
destAdr = (char *) mxMalloc(destAdrLen); 
if (destAdr == NULL) { 
    mexErrMsgTxt("mxMalloc(destAdrLen) failed"); 
} 
mxGetString(prhs[0], destAdr, destAdrLen); 

destPort = (int) mxGetScalar(prhs[1]); 

if (isalpha(destAdr[0])) { 
    // socket address is a name 
    hp = gethostbyname(destAdr); 
} 
else {  
    // socket address is a number 
    addr = inet_addr(destAdr); 
    hp = gethostbyaddr((char *)&addr, 4, AF_INET); 
} 
+1

11.234.456.74가 유효한 IPv4 주소가 아닙니다. 그 원인 일 수 있습니다. 'h_errno' 값은 무엇입니까? –

+0

댓글을 주신 Daniel에게 감사드립니다. 오타입니다. 나는 말하고 싶다. 11.234.217.74 이것은 유효한 주소이다. Windows에서 코드를 실행할 때 올바르게 해석됩니다. 그러나 Linux에서 실행되는 데는 실패합니다. Linux에서 gethostbyaddr가 NULL을 반환합니다. – Hatems

+2

당신은'destAdr'을위한 메모리를 할당했습니다, 그러나 그것은 빈 것처럼 보입니다 ... 적어도 당신의 샘플 코드에서. – shinkou

답변

1

해당 호스트에 역방향 DNS 레코드가 등록 된 것으로 표시되지 않습니다.

$ dig -x 11.234.217.74 

; <<>> DiG 9.9.1-P2 <<>> -x 11.234.217.74 
;; global options: +cmd 
;; Got answer: 
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 30231 
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0 

;; QUESTION SECTION: 
;74.217.234.11.in-addr.arpa. IN PTR 

;; AUTHORITY SECTION: 
in-addr.arpa.  3599 IN SOA b.in-addr-servers.arpa. nstld.iana.org. 2011026180 1800 900 604800 3600 

;; Query time: 1217 msec 

따라서 gethostbyaddr에 대한 호출이 실패합니다. herror 함수는 심지어 Unknown host의 메시지를 인쇄합니다. 이 경우 숫자 IP를 유지하려면 코드 경로를 직접 작성해야합니다. Windows가 다른 작업을 수행하는 경우 정보가있는 위치를 확인하는 것이 좋습니다.

+0

응답 해 주셔서 감사합니다. 나는이 코드를 212.58.226.75와 같은 꽤 알려진 addreses로 시도했다. 그것은 작동하고있는 것 같습니다. 그럼 내 일의 몇 가지 주소로 그것을 썼다. 실패했습니다. 이 주소는 내 직장 주소의 DNS가 작동하지 않는다고 말했습니다. Windows의 경우. 그것은 매우 이상합니다. DNS가 내부적으로 작동하지 않더라도 왜 Windows에서 gethostbyaddress가 NULL을 반환하지 않는지 알 수 없습니다. 그것은 윈도우 일 수 있고 리눅스는 다른 DNS 절차를 사용할 수 있습니까? – Hatems

+0

그냥 짐작 하긴하지만 [WINS] (http://en.wikipedia.org/wiki/Windows_Internet_Name_Service)를 사용하여 windows가 이름을 확인할 수도 있습니다. – MvG

관련 문제