2012-08-06 71 views
1

這段代碼在Windows上工作正常,但gethostbyaddr在Linux上返回NULL。gethostbyaddr在Windows上正常,但在Linux上返回NULL

我已經嘗試過這麼多的改變,但沒有任何成功。

我/etc/host.conf中有如下一行

爲了主機,結合

我運行的完整代碼,並通過地址11.234.456.74, 在窗口gethostbyaddr解析地址,工作正常。 但是,在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'有什麼價值? – 2012-08-06 15:02:28

+0

感謝Daniel評論。這是一個錯字。我只想說11.234.217.74這是一個有效的地址。它在Windows上運行代碼時可以正確解析。但是在Linux上運行失敗。 gethostbyaddr在Linux上返回NULL。 – Hatems 2012-08-06 16:19:08

+2

您爲'destAdr'分配了內存,但它看起來像是空的......至少在您的示例代碼中。 – shinkou 2012-08-06 16:37:13

回答

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

感謝您的回覆。我已經嘗試了這個代碼,並且有很多已知的addreses,如212.58.226.75。它似乎在工作。然後用我的一些工作地址試了一下。它失敗了。這告訴我,我的工作地址的DNS不起作用。對於Windows。這很奇怪。我不知道爲什麼在Windows中gethostbyaddress不是不返回NULL,雖然DNS不在內部工作。它可以是Windows和Linux使用不同的DNS程序? – Hatems 2012-08-07 08:21:50

+0

只是猜測,但它可能是Windows使用[WINS]解析名稱(http://en.wikipedia.org/wiki/Windows_Internet_Name_Service)。 – MvG 2012-08-07 10:03:18

相關問題