【发布时间】: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.client或dig -x ip.address.of.client进行验证,看看您得到了什么。 (假设您使用的是 dns) -
@EdHeal 你是对的。在我的辩护中,我的老师没有提到它不会起作用,但我当然应该自己理解它:D
-
在 /etc/hosts 中输入一个条目,然后该函数应该可以工作并为该 IP 地址返回一些内容
-
调用
recvfrom()时,len = sizeof(request);需要改为len = sizeof(cliaddr);。并且你需要在调用gethostbyaddr()之前检查recvfrom()的返回值是否成功,否则你会向它传递垃圾。