客户端中直接使用IP地址会有很大的弊端,一旦IP地址变化(IP地址会经常变动),客户端软件就会出现错误。

而使用域名会方便很多,注册后的域名只要每年续费就永远属于自己的,更换IP地址时修改域名解析即可,不会影响软件的正常使用。

关于域名注册、域名解析、host 文件、DNS 服务器等自行学习。重点讲解如何使用域名。

通过域名获取IP地址

域名仅仅是IP地址的一个助记符,目的是方便记忆,通过域名并不能找到目标计算机,通信之前必须要将域名转换成IP地址。

gethostbyname() 函数可以完成这种转换,它的原型为:

struct hostent *gethostbyname(const char *hostname);

hostname 为主机名,也就是域名。使用该函数时,只要传递域名字符串,就会返回域名对应的IP地址。返回的地址信息会装入 hostent 结构体,该结构体的定义如下:

struct hostent{char *h_name;  //official namechar **h_aliases;  //alias listint  h_addrtype;  //host address typeint  h_length;  //address lenghtchar **h_addr_list;  //address list
}

从该结构体可以看出,不只返回IP地址,还会附带其他信息,只需关注最后一个成员 h_addr_list。下面是对各成员的说明:

  • h_name:官方域名(Official domain name)。官方域名代表某一主页,但实际上一些著名公司的域名并未用官方域名注册。
  • h_aliases:别名,可以通过多个域名访问同一主机。同一IP地址可以绑定多个域名,因此除了当前域名还可以指定其他域名。
  • h_addrtype:gethostbyname() 不仅支持 IPv4,还支持IPv6,可以通过此成员获取IP地址的地址族(地址类型)信息,IPv4 对应 AF_INET,IPv6 对应 AF_INET6。
  • h_length:保存IP地址长度。IPv4 的长度为4个字节,IPv6 的长度为16个字节。
  • h_addr_list:这是最重要的成员。通过该成员以整数形式保存域名对应的IP地址。对于用户较多的服务器,可能会分配多个IP地址给同一域名,利用多个服务器进行均衡负载。
  • hostent 结构体变量的组成如下图所示:

下面的代码主要演示 gethostbyname() 的应用,并说明 hostent 结构体的特性:

#include <stdlib.h>
#include <stdio.h>
#include <WinSock2.h>
#pragma comment(lib,"ws2_32.lib")int main()
{WSADATA wsaData;WSAStartup(MAKEWORD(2, 2), &wsaData);struct hostent *host = gethostbyname("www.baidu.com");if (!host){puts("Get IP address error!");system("pause");exit(0);}//别名for (int i = 0; host->h_aliases[i]; i++){printf("Aliases %d: %s\n", i + 1, host->h_aliases[i]);}//地址类型printf("Address type: %s\n", (host->h_addrtype == AF_INET) ? "AF_INET" : "AF_INET6");//IP地址for (int i = 0; host->h_addr_list[i]; i++){printf("IP addr %d: %s\n", i + 1, inet_ntoa(*(struct in_addr*)host->h_addr_list[i]));}system("pause");return 0;
}

运行结果:

在socket 中使用域名相关推荐

  1. socket中的TCP编程(调用免费聊天的机器人实现自动回复)

    socket中的TCP编程(调用免费聊天的机器人实现自动回复) 在无聊时间复习了socket编程,写了这个简易代码!!注意要在联网状态下跑 1:服务器模块: import socket import ...

  2. python变量域名_Python实现从url中提取域名的几种方法

    从url中找到域名,首先想到的是用正则,然后寻找相应的类库.用正则解析有很多不完备的地方,url中有域名,域名后缀一直在不断增加等.通过google查到几种方法,一种是用Python中自带的模块和正则 ...

  3. 简单分析一下socket中的bind

    在最开始接触bind的时候,只是在写基于tcp的server端的时候,知道在listen之前需要先bind一下,用来确保socket能在某个固定的端口监听.而bind的时候,函数参数中的端口填自己将要 ...

  4. Java socket中关闭IO流后,发生什么事?(以关闭输出流为例)

    为了方便讲解,我们把 DataOutputstream dout = new DataOutputStream(new BufferedOutputStream(mySocket.getOutputS ...

  5. lstm中look_back的大小选择_基于机器学习检测僵尸网络中的域名生成算法

    0x01 Absert 恶意软件通常使用域名生成算法(DGA)作为联系其C&C服务器的机制.近年来,基于机器学习已经提出了不同的方法来自动检测生成的域名.但也存在一些问题.第一个问题是,由于缺 ...

  6. 关于DNS服务中查询域名的命令

    关于DNS服务中查询域名的命令 一.域名与DNS 二.查询DNS的命令 1.dig ①.简介 ②.格式 ③.参数 ④.实例 2. host ①.介绍 ②.格式 ③.参数 ④.实例 3.nslookup ...

  7. PYTHON__关于Socket中的Select使用理解

    关于Socket中的Select使用理解 以下是代码和中文注释的个人理解 import socket, select, Queueserver=('192.168.2.100',10086)#创建TC ...

  8. linux socket默认超时时间设置,Socket中如何设置连接超时 (转)

    Socket中如何设置连接超时 (转) Socket中如何设置连接超时 AntGhazi/2001.12.14 主页:antghazi.yeah 把CSDN与中文翻了底朝天,也没找到如何设置socke ...

  9. Socket中如何设置连接超时

    Socket中如何设置连接超时 (antghazi发表于2003-3-16 9:28:38) 设置connect的超时很简单,CSDN上也有人提到过使用select,但却没有一个令人满意与完整的答案. ...

最新文章

  1. spring boot入门:@SpringBootApplication
  2. c 服务器文件是否存在,c服务器文件是存在
  3. NodeJS使用ES6
  4. mysql如何定位到数据_如何快速定位当前数据库消耗CPU最高的sql语句?
  5. Linux服务器安全配置实例(二)用户账户权限配置
  6. vue从创建到完整的饿了么(7)点击事件与页面跳转
  7. MFC实现虚拟桌面(桌面切换)
  8. PostgreSQL/pgsql数据库优化查询和索引的猜想
  9. 11. Flash助手推荐的弹窗广告怎么删除
  10. 用python实现加减乘除计算器
  11. MATLAB实现2ASK,2PSK,2FSK
  12. Hi3516芯片简介,Hi3516EV300处理器参数介绍
  13. 2017acl---Learning Cognitive Features from Gaze Data for Sentiment and Sarcasm Classification笔记
  14. 10秒就会让男人爱上的美女 长什么样
  15. js基础-小案例歌词匹配
  16. 语法最简单的微博通用爬虫weibo_crawler
  17. Pandas读取Excel中的股票代码时,补全前面0的办法
  18. php程序yii是什么意思,【PHP开辟框架】yii是什么意义
  19. pyqt5+opencv-python打开摄像头(已实现)
  20. JDK8最新版本jdk-8u331

热门文章

  1. mysql特殊符号无法储存_解决MYSQL数据库无法保存emoji表情及特殊符号问题
  2. 20180108 自省
  3. C++加载PNG图片
  4. 电脑路由器,怎么把自己的电脑变成路由器
  5. Java程序设计课程教学实践
  6. JUR 项目评级:BB ,展望稳定 | TokenInsight
  7. 泰坦尼克数据分析与预处理
  8. 用Python做雷霆战机小游戏【附素材+源码】
  9. 百度之星资格赛 1003 度度熊与邪恶大魔王 DP 完全背包
  10. 飞利浦、TCL、海信、REASONANCE、七彩虹、Amazfit在CES展示最新新品 | 美通企业日报...