#include <stdafx.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#include <windows.h>
#pragma comment(lib, "ws2_32.lib")
int main(int argc, char **argv)
{
//-----------------------------------------
// 定义初始化变量
WSADATA wsaData;
int iResult;
DWORD dwError;
int i = 0;
struct hostent *remoteHost;
char *host_name;
struct in_addr addr;
char **pAlias;
// 校验参数
if (argc != 2) {
printf("usage: %s ipv4address\n", argv[0]);
printf(" or\n");
printf(" %s hostname\n", argv[0]);
printf(" to return the host\n");
printf(" %s 127.0.0.1\n", argv[0]);
printf(" to return the IP addresses for a host\n");
printf(" %s www.a3gs.com\n", argv[0]);
return 1;
}
// 初始化Winsock
iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != 0) {
printf("WSAStartup failed: %d\n", iResult);
return 1;
}
host_name = argv[1];
// 如果用户输入是一个字母, 则我们使用gethostbyname()函数
// 假如输入是数字,则判断为IP地址
if (isalpha(host_name[0])) {
printf("Calling gethostbyname with %s\n", host_name);
remoteHost = gethostbyname(host_name);
} else {
printf("使用%s调用gethostbyaddr函数%s\n", host_name);
addr.s_addr = inet_addr(host_name);
if (addr.s_addr == INADDR_NONE) {
printf("请输入有效IPv4地址\n");
return 1;
} else
{
remoteHost = gethostbyaddr((char *) &addr, 4, AF_INET);
}
}
if (remoteHost == NULL) {
dwError = WSAGetLastError();
if (dwError != 0) {
if (dwError == WSAHOST_NOT_FOUND) {
printf("无法定位到主机\n");
return 1;
}else if (dwError == WSANO_DATA) {
printf("无路由记录\n");
return 1;
} else {
printf("函数调用出错,代码: %ld\n", dwError);
return 1;
}
}
} else {
printf("函数返回:\n");
printf("\t主机名称: %s\n", remoteHost->h_name);
for (pAlias = remoteHost->h_aliases; *pAlias != 0; pAlias++) {
printf("\t主机别名#%d: %s\n", ++i, *pAlias);
}
printf("\t地址类型: ");
switch (remoteHost->h_addrtype) {
case AF_INET:
printf("AF_INET\n");
break;
case AF_INET6:
printf("AF_INET6\n");
break;
case AF_NETBIOS:
printf("AF_NETBIOS\n");
break;
default:
printf(" %d\n", remoteHost->h_addrtype);
break;
}
printf("\t地址长度: %d\n", remoteHost->h_length);
i = 0;
while (remoteHost->h_addr_list[i] != 0) {
addr.s_addr = *(u_long *) remoteHost->h_addr_list[i++];
printf("\t主机IP地址#%d: %s\n", i, inet_ntoa(addr));
}
}
return 0;
}