【问题标题】:C gethostbyaddr returns NULLC gethostbyaddr 返回 NULL
【发布时间】:2017-01-26 15:52:34
【问题描述】:

我真的是 C 和套接字的初学者。我知道我不应该在考试中使用 gethostbyaddr 所以我必须使用他们告诉我使用的东西...... 我正在使用来自 Linux 机器(Ubuntu 14.04)的这段代码。

我正在尝试编写一个 echo c/s 程序。一切正常,但是当我尝试从服务器获取有关客户端的一些信息时,struct hostent * clienthost 为空。

这是我的 server.c:

int main(int argc, char * argv[])
{
    struct sockaddr_in cliaddr, servaddr;
    struct hostent * clienthost;
    int port, sd, len;
    char request[MAX_LENGTH];
    const int on = 1;

    port = atoi(argv[1]);

    memset ((char *)&servaddr, 0, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = INADDR_ANY;  
    servaddr.sin_port = htons(port);

    sd=socket(AF_INET, SOCK_DGRAM, 0);
    setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
    bind(sd,(struct sockaddr *) &servaddr, sizeof(servaddr));

    for (;;)
    {
        len = sizeof(request);
        recvfrom(sd, request, sizeof(request), 0, (struct sockaddr *) &cliaddr, &len);

        clienthost = gethostbyaddr( (char *) &cliaddr.sin_addr, sizeof(cliaddr.sin_addr), AF_INET);
        if (clienthost == NULL) 
            printf("client host information not found\n");
        else 
            printf("Operation from: %s %i\n", clienthost->h_name,(unsigned)ntohs(cliaddr.sin_port));

        sendto(sd, &request, sizeof(request), 0, (struct sockaddr *)&cliaddr, len);
    }

    return 0;
}

【问题讨论】:

  • 客户端是否有 DNS 条目 - 如果没有,请在 /etc/hosts 中进行测试
  • 您确定该地址确实有 PTR 记录吗?如果出现问题,它将返回 NULL 并设置 h_errno 并显示错误。查看man gethostbyaddr 了解更多信息。我的猜测是您正在查找 IP 地址并且找不到主机。您可以通过 host ip.address.of.clientdig -x ip.address.of.client 进行验证,看看您得到了什么。 (假设您使用的是 dns)
  • @EdHeal 你是对的。在我的辩护中,我的老师没有提到它不会起作用,但我当然应该自己理解它:D
  • 在 /etc/hosts 中输入一个条目,然后该函数应该可以工作并为该 IP 地址返回一些内容
  • 调用recvfrom() 时,len = sizeof(request); 需要改为len = sizeof(cliaddr);。并且你需要在调用gethostbyaddr()之前检查recvfrom()的返回值是否成功,否则你会向它传递垃圾。

标签: c sockets


【解决方案1】:

客户端是否有 DNS 条目 - 如果没有,则将其放入 /etc/hosts 进行测试 ——埃德·赫尔

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 2014-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多