第一个网络程序---hostent

在windock api 中,用gethostbyname()和 wsaasyncGetHostByName()函数实现主机名称解析,用gethostbyaddr() 和wsaasyncGetHostByAddr() 函数试实现地址解析。

winsock中的hostent 结构体  typedef sturct hostent{

char * h_name;  //主机名

char ** h_aliases; //主机别名

short h_addrtype;  //地址类型

short h_length  ;//地址长度

char ** h_addr_list;  //地址列表

}HOSTENT,*PHOSTENT ,*LPHOSTENT;

下面直接看第一个Windows网络程序源码:

//hostent编程
#define WIN32_LEAN_AND_MEAN
#include <winsock2.h>
#include <WS2tcpip.h>
#include <stdio.h>
#include <iostream>
using namespace std;
//链接ws2_32.lib
#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;
//校验命令行参数
cout<<argc<<endl;
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];
//如果输入的是主机名,使用gethostbyname()解析
//否则,使用gethostbyaddr()解析
if(isalpha(host_name[0]))
{
printf("calling gethostbyname with %s\n",host_name);
remoteHost=gethostbyname(host_name);
}else
{
printf("calling egthostbyaddr with %s\n",host_name);
addr.S_un.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 == nullptr)
{
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("主机解析错误,错误码: %1d\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);
}*/

while(remoteHost->h_aliases[i])
{
cout<<"\t主机别名:"<<remoteHost->h_aliases[i++]<<endl;
}
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);
if(remoteHost->h_addrtype== AF_INET)
{
i=0;
while(remoteHost->h_addr_list[i]!=0){
addr.S_un.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、付费专栏及课程。

余额充值