0

リモートシステムのホスト名を取得しようとしていますが、gethostbyaddr がエラー番号 22 で失敗し、errno.h によると EINVAL です。Windows システムのホスト名を取得しようとして失敗しました。Linux システムの場合も同じです.しかし、同じ関数はWindowsでもうまく機能します.関数が機能するには逆のDNSレコードが存在する必要があるため、スレッドを調べました.リモートシステム名を取得するための他の代替関数はありますか? 以下にコードを掲載しましたので、入手方法を教えてください。

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <unistd.h>
#include <errno.h>
#include <arpa/inet.h>



int main(void)
{

    struct hostent *hp;
    in_addr_t ipaddr;
    char Ipaddr[20];

    printf("\n Enter the ip address : ");
    scanf("%s",Ipaddr);

    ipaddr=inet_addr(Ipaddr);

    printf("Converted ip address : %zu",ipaddr);

    printf("\n Hostname is : %s",hname);   
    hp=gethostbyaddr((void *)&ipaddr,4,AF_INET);
    if(hp==NULL)
    {
        printf("\n The hostname could not be found ");
        perror("gethostbyaddr"); // error printed as "gethostbyaddr: Success"
        printf("Error Number : %d",errno); //error number is : 22 which is EINVAL as per the header file

        return 0;
    }
    printf("\n The hostname by gethostbyaddr : %s",hp->h_name);

}

編集

#include <stdio.h>

#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <unistd.h>
#include <errno.h>
#include <arpa/inet.h>

int main(int argc, char **argv)
{
    int dwRetval;

    struct sockaddr_in saGNI;
    char hostname[NI_MAXHOST];
    char servInfo[NI_MAXSERV];
    u_short port = 27015;

    char Ip_Address[18];

    // Validate the parameters

    printf("enter the ip address : ");
    scanf("%s",Ip_Address);


    //-----------------------------------------
    // Set up sockaddr_in structure which is passed
    // to the getnameinfo function
    saGNI.sin_family = AF_INET;
    saGNI.sin_addr.s_addr = inet_addr(Ip_Address);
    saGNI.sin_port = htons(port);

    //-----------------------------------------
    // Call getnameinfo
    dwRetval = getnameinfo((struct sockaddr *) &saGNI,
                           sizeof (struct sockaddr),
                           hostname,
                           NI_MAXHOST, servInfo, NI_MAXSERV,NI_NOFQDN);

    if (dwRetval != 0) {
        perror("getnameinfo");
        printf("getnameinfo returned herror = %d\n", errno);

        return 1;
    } else {
        printf("getnameinfo returned hostname = %s\n", hostname);
        return 0;
    }
}
4

1 に答える 1

1

コードの解決は問題ないようですが、エラー報告の部分が間違っています。少なくとも Unix では、を設定gethostbyaddr()しませerrno。エラーの場合、 h_errnoが設定されherror()、テキスト エラー メッセージを出力するために使用できます。

if (hp == NULL) {
    herror("Could not resolve address");
    printf("Error Number : %d", h_errno);

    return 0;
}

注: IP アドレスをホスト名に変換するためのより新しいインターフェイスは getnameinfo()です。IPv4 と IPv6 で動作し、Unix と Windows で同じように動作するはずです。

于 2013-10-12T08:01:20.613 に答える