Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C gethostbyaddr返回NULL_C_Sockets - Fatal编程技术网

C gethostbyaddr返回NULL

C gethostbyaddr返回NULL,c,sockets,C,Sockets,我真的是一个C和套接字的初学者。我知道我不应该使用gethostbyaddr,因为这是为了考试,所以我必须使用他们告诉我要使用的。。。 我使用的代码来自Linux机器(Ubuntu 14.04) 我想写一个echo c/s程序。所有这些都可以正常工作,但当我尝试从服务器获取有关客户端的一些信息时,struct hostent*clienthost为空 这是我的服务器。c: int main(int argc, char * argv[]) { struct sockaddr_in cli

我真的是一个C和套接字的初学者。我知道我不应该使用gethostbyaddr,因为这是为了考试,所以我必须使用他们告诉我要使用的。。。 我使用的代码来自Linux机器(Ubuntu 14.04)

我想写一个echo c/s程序。所有这些都可以正常工作,但当我尝试从服务器获取有关客户端的一些信息时,
struct hostent*clienthost
为空

这是我的服务器。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
中进行测试
–Ed Heal

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