I'm trying to get hostname of a remote system and the gethostbyaddr fails with error number 22 which according to errno.h is EINVAL .I'm trying to get the hostname of an windows system and its failing and the same is for linux system.But the same function works well on windows.I had gone through the thread as per them a reverse dns record must be present for the function to work .Is there any other alternative function to get the remote system name ? I have posted the code below ,please let me know the method to get the same.
#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);
}
EDIT
#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;
}
}