在socket 中使用域名
客户端中直接使用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 中使用域名相关推荐
- socket中的TCP编程(调用免费聊天的机器人实现自动回复)
socket中的TCP编程(调用免费聊天的机器人实现自动回复) 在无聊时间复习了socket编程,写了这个简易代码!!注意要在联网状态下跑 1:服务器模块: import socket import ...
- python变量域名_Python实现从url中提取域名的几种方法
从url中找到域名,首先想到的是用正则,然后寻找相应的类库.用正则解析有很多不完备的地方,url中有域名,域名后缀一直在不断增加等.通过google查到几种方法,一种是用Python中自带的模块和正则 ...
- 简单分析一下socket中的bind
在最开始接触bind的时候,只是在写基于tcp的server端的时候,知道在listen之前需要先bind一下,用来确保socket能在某个固定的端口监听.而bind的时候,函数参数中的端口填自己将要 ...
- Java socket中关闭IO流后,发生什么事?(以关闭输出流为例)
为了方便讲解,我们把 DataOutputstream dout = new DataOutputStream(new BufferedOutputStream(mySocket.getOutputS ...
- lstm中look_back的大小选择_基于机器学习检测僵尸网络中的域名生成算法
0x01 Absert 恶意软件通常使用域名生成算法(DGA)作为联系其C&C服务器的机制.近年来,基于机器学习已经提出了不同的方法来自动检测生成的域名.但也存在一些问题.第一个问题是,由于缺 ...
- 关于DNS服务中查询域名的命令
关于DNS服务中查询域名的命令 一.域名与DNS 二.查询DNS的命令 1.dig ①.简介 ②.格式 ③.参数 ④.实例 2. host ①.介绍 ②.格式 ③.参数 ④.实例 3.nslookup ...
- PYTHON__关于Socket中的Select使用理解
关于Socket中的Select使用理解 以下是代码和中文注释的个人理解 import socket, select, Queueserver=('192.168.2.100',10086)#创建TC ...
- linux socket默认超时时间设置,Socket中如何设置连接超时 (转)
Socket中如何设置连接超时 (转) Socket中如何设置连接超时 AntGhazi/2001.12.14 主页:antghazi.yeah 把CSDN与中文翻了底朝天,也没找到如何设置socke ...
- Socket中如何设置连接超时
Socket中如何设置连接超时 (antghazi发表于2003-3-16 9:28:38) 设置connect的超时很简单,CSDN上也有人提到过使用select,但却没有一个令人满意与完整的答案. ...
最新文章
- spring boot入门:@SpringBootApplication
- c 服务器文件是否存在,c服务器文件是存在
- NodeJS使用ES6
- mysql如何定位到数据_如何快速定位当前数据库消耗CPU最高的sql语句?
- Linux服务器安全配置实例(二)用户账户权限配置
- vue从创建到完整的饿了么(7)点击事件与页面跳转
- MFC实现虚拟桌面(桌面切换)
- PostgreSQL/pgsql数据库优化查询和索引的猜想
- 11. Flash助手推荐的弹窗广告怎么删除
- 用python实现加减乘除计算器
- MATLAB实现2ASK,2PSK,2FSK
- Hi3516芯片简介,Hi3516EV300处理器参数介绍
- 2017acl---Learning Cognitive Features from Gaze Data for Sentiment and Sarcasm Classification笔记
- 10秒就会让男人爱上的美女 长什么样
- js基础-小案例歌词匹配
- 语法最简单的微博通用爬虫weibo_crawler
- Pandas读取Excel中的股票代码时,补全前面0的办法
- php程序yii是什么意思,【PHP开辟框架】yii是什么意义
- pyqt5+opencv-python打开摄像头(已实现)
- JDK8最新版本jdk-8u331
热门文章
- mysql特殊符号无法储存_解决MYSQL数据库无法保存emoji表情及特殊符号问题
- 20180108 自省
- C++加载PNG图片
- 电脑路由器,怎么把自己的电脑变成路由器
- Java程序设计课程教学实践
- JUR 项目评级:BB ,展望稳定 | TokenInsight
- 泰坦尼克数据分析与预处理
- 用Python做雷霆战机小游戏【附素材+源码】
- 百度之星资格赛 1003 度度熊与邪恶大魔王 DP 完全背包
- 飞利浦、TCL、海信、REASONANCE、七彩虹、Amazfit在CES展示最新新品 | 美通企业日报...