// project1-1-1602.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
# define WIN32_LEAN_MEAN
#include <winsock2.h>
#include <ws2tcpip.h>
// 连接2_32.lib
# pragma comment(lib, "ws2_32.lib")
int _tmain(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("用法:%s ipv4address\n", argv[0]);
printf("or\n");
printf(" %s hostname\n", argv[0]);
printf("主机名称解析\n");
printf(" %s 127.0.0.1\n", argv[0]);
printf("网络地址解析\n");
printf(" %s www.163.com\n", argv[0]);
return 1;
}
// 初始化WinSock服务
iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if(iResult != 0){
printf("WinSock服务启动失败:%d\n", iResult);
return 1;
}
host_name = argv[1];
// 如果输入的是主机名,使用gethostbuname()解析
// 否则使用gethostaddr()解析
if(isalpha(host_name[0])){
/* 主机解析 */
printf("Calling gethostbyname with %s \n", host_name);
remoteHost = gethostbyname(host_name);
}else{
printf("Calling gethostbyaddr with %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;
}
if(remoteHost -> h_addrtype == AF_INET){
i = 0;
while(remoteHost -> h_addr_list[i] != 0){
addr.s_addr = * (u_long * ) remoteHost -> h_addr_list[i++];
printf("\tIPv4地址# %d: %s\n", i, inet_ntoa(addr));
}
}else if(remoteHost -> h_addrtype == AF_INET6){
printf("\t远程主机为IPv6地址\n");
}
}
return 0;
}
程序1-主机名称和地址解析完整代码
于 2021-08-31 18:12:23 首次发布
该代码演示了如何使用WinSock库初始化服务,并通过gethostbyname()和gethostbyaddr()函数解析主机名或IPv4地址。如果输入是主机名,它会调用gethostbyname(),如果是IP地址,则调用gethostbyaddr()。解析成功后,程序将打印出主机名、别名、地址类型和IPv4地址。
摘要由CSDN通过智能技术生成