我正在尝试获取远程系统的主机名,并且gethostbyaddr失败,错误号为22,根据errno.h是EINVAL。我正在尝试获取Windows系统的主机名及其失败,对于Linux系统也是如此。但是相同的功能在Windows上运行良好。我已经按照thread进行了检查,因为必须存在一个反向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;
}
}
最佳答案
解析代码似乎可以,但是错误报告部分有误。
至少在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和视窗。
关于c - Gethostbyaddr在Linux中失败,但可在Windows计算机上使用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19331718/