您的位置:首页 > 编程语言 > C语言/C++

C++服务器之IP与域名转换

2017-01-27 08:36 309 查看

程序是使用域名还是直接使用IP

答案很明显,对网络有一定了解的都会知道IP这个是可变的,虽然ISP会维持原有的IP,但是一个程序不能依赖这一点,这将会导致程序的扩展性变低。(如:一个已经开发完成的程序,当仅需要更换IP时,这将导致整个程序的从新编译,而客户端则需要重新下载程序,显而使用域名 DNS来解析则很方便的解决这个问题,而不是整个程序从新编译。)

函数:

#include <netdb.h>


struct hostent* gethostbyname(const char* hostname);

成功返回hostent结构体地址,失败返回NULL

hostent 结构体定义:

struct hostent {

char* h_name;

char** h_aliases;

int h_addrtype;

int h_length;

char** h_addr_list;

}

参数说明:

h_name:变量存有官方域名,某一主页。

h_aliases:可以多个域名访问同一个主页,同一个IP可以绑定多个域名。信息都由此获得。

h_addrtype:gethostbyname此函数支持 IPV4 和 IPV6。可以通过此变量获取保存在h_addr_list的IP地址族信息。IPv4 中存有 AF_INET。

h_length:保存IP地址的长度,IPv4 是4字节,所以是4,。IPv6 是16字节,所以是16。

h_addr_list:重要成员。以整数的形式保存域名对应的IP地址。如果用户较多,有可能分配多个IP在同一个域名,服务器的负载均衡。(也可以通过此变量获取IP地址信息。)

Linux/Unix代码清单:

//
// main.cpp
// HostTest
//
// Created by JiangXinBin on 2017/1/27.
// Copyright © 2017年 JiangXinBin. All rights reserved.
//

#include <iostream>
#include <stdio.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netdb.h>
using namespace std;

void ServerOutMessage(char *str);

int main(int argc, const char * argv[]) {

int i;
struct hostent *host;

host = gethostbyname("www.baidu.com");
if(!host){
ServerOutMessage("gethost...error");
}
ServerOutMessage(host->h_name);
for (i = 0; host->h_aliases[i]; i++) {
cout << "Aliases " << i+1 << ":" << host->h_aliases[i] << "\n" << endl;
}
printf("Address type: %s \n",(host->h_addrtype == AF_INET) ? "AF_INET" : "AF_INET6");

for (i = 0; host->h_addr_list[i]; i++) {
cout << "IP addr " << i+1 << ":" << inet_ntoa(*(struct in_addr*)host->h_addr_list[i]) << "\n" << endl;
}
return 0;
}

void ServerOutMessage(char *str){

cout << "服务器信息:" << str << endl;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  网络