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

程序是使用域名还是直接使用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;

}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值