C gethostbyaddr返回NULL
我真的是一个C和套接字的初学者。我知道我不应该使用gethostbyaddr,因为这是为了考试,所以我必须使用他们告诉我要使用的。。。 我使用的代码来自Linux机器(Ubuntu 14.04) 我想写一个echo c/s程序。所有这些都可以正常工作,但当我尝试从服务器获取有关客户端的一些信息时,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
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()的返回值是否成功,否则将向其传递垃圾。