程序1-主机名称和地址解析完整代码

该代码演示了如何使用WinSock库初始化服务,并通过gethostbyname()和gethostbyaddr()函数解析主机名或IPv4地址。如果输入是主机名,它会调用gethostbyname(),如果是IP地址,则调用gethostbyaddr()。解析成功后,程序将打印出主机名、别名、地址类型和IPv4地址。
摘要由CSDN通过智能技术生成
// 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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值