1

このコードは Windows では問題なく動作しますが、Linux では gethostbyaddr が NULL を返します。

私は非常に多くの変更を試みましたが、成功しませんでした。

私の /etc/host.conf には次の行があります

ホストの注文、バインド

完全なコードを実行し、アドレス 11.234.456.74 を渡します。Windows では 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);
}
4

1 に答える 1

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 が何か他のことをするなら、それがどこから情報を得たのかを見るのは興味深いでしょう。

于 2012-08-06T16:50:47.103 に答える