第14章 UDP编程(2)_端口绑定和域名解析
2. 端口绑定和域名解析
2.1 端口绑定:SO_REUSEADDR选项
int opt = ;//1表示启用该选项
//设置为可重新使用端口,每次启动该端口时,会重新绑定端口。相当于端口被复位并被重新。
//绑定。因此,以后以最后这次绑定为准
if((ret = setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))) < ){
perror("setsockopt error");
exit();
}
2.2 域名解析
(1)域名解析过程
(2)域名解析函数
头文件 |
#include <netdb.h> |
函数 |
struct hostent* gethostent(void); struct hostent* gethostbyname(const char* hostname); void sethostent(int stayopen); void endhostent(void); //注意get和endhostent应成对使用! |
参数 |
struct hostent{ |
功能 |
域名解析 |
备注 |
查看域名和IP映射关系:#more /etc/hosts |
(3)hostent结构体
(4)域名解析案例
//域名解析,并将结果保存在hostent结构体中
if((hptr = gethostbyname("www.google.com")) == NULL){
fprintf(stderr, "gethostbyname call failed.%s\n",
hstrerror(h_errno));
return -;
} printf("official name: %s\n", hptr->h_name); //输出正式名
for(pptr = hptr->h_aliases; *pptr != NULL; pptr++){ //输出对应各个别名
printf("\t alias: %s\n", *pptr);
} if(hptr->h_addrtype != AF_INET){ //判断是否为IPv4地址
fprintf(stderr, "Invalid address type %d\n", hptr->addrtype);
return -;
} pptr = hptr->h_addr_list;
for(; *pptr != NULL; pptr++){ //输出点分十进制的IP地址(字符串)
printf("\t address: %s\n",
inet_ntop(hptr->h_addrtype, *pptr, str, sizeof(str)));
}
【编程实验】根据域名解析出IP地址
//gethost.c
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <string.h> int is_host(struct hostent* host, char* name)
{
//如果正式名为name,则直接返回
if(!strcmp(host->h_name, name)) return ; //查找别名为name
int i = ;
while(host->h_aliases[i] != NULL){
if(!strcmp(host->h_aliases[i], name)) return ;
i++;
}
} //根据主机名获取IP
unsigned int get_ip_by_name(char* name)
{
unsigned int ip = ;
struct hostent* host;
//遍历/etc/hosts文件,找出所有的主机名。
//每调用一次gethostent将读取文件的一行(对应一个主机)
while((host = gethostent()) != NULL){
if(is_host(host, name)){
//h_addr_list[0]中所存放在IP是网络字节序,共4个字节。
memcpy(&ip, host->h_addr_list[], );
break;
}
}
endhostent();
return ip;
} void out_addr(struct hostent* h)
{
printf("hostname: %s\n", h->h_name);
printf("addrtype: %s\n", h->h_addrtype == AF_INET ? "IPv4": "IPv6"); char ip[];
memset(ip, , sizeof(ip));
inet_ntop(h->h_addrtype, h->h_addr_list[], ip, sizeof(ip));//绑定的第1个IP地址
printf("ip address: %s\n", ip); //别名
int i = ;
while(h->h_aliases[i] != NULL){
printf("aliases: %s\n", h->h_aliases[i]);
i++;
}
} int main(int argc, char* argv[])
{
if(argc < ){
printf("usage: %s host\n", argv[]);
exit();
} struct hostent* h;
h = gethostbyname(argv[]); if(h != NULL){
out_addr(h);
}else{
printf("no %s exist\n", argv[]);
} //根据主机名,输出IP
unsigned int ipNet = get_ip_by_name(argv[]); //网络字节序IP
char ip[];
memset(ip, , sizeof(ip));
inet_ntop(AF_INET, &ipNet, ip, sizeof(ip));//绑定的第1个IP地址
printf("ip address: %s\n", ip); return ;
}
/*host文件
* [root@localhost 14.udp]# more /etc/hosts
* 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
* 192.168.32.100 santaclaus www.5iedu.com
* ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
*
*输出结果
[root@localhost 14.udp]# bin/gethost santaclaus
hostname: santaclaus
addrtype: IPv4
ip address: 192.168.32.100
aliases: www.5iedu.com
ip address: 192.168.32.100
[root@localhost 14.udp]# bin/gethost www.5iedu.com
hostname: santaclaus
addrtype: IPv4
ip address: 192.168.32.100
aliases: www.5iedu.com
ip address: 192.168.32.100
[root@localhost 14.udp]# bin/gethost localhost
hostname: localhost
addrtype: IPv4
ip address: 127.0.0.1
aliases: localhost.localdomain
aliases: localhost4
aliases: localhost4.localdomain4
aliases: localhost.localdomain
aliases: localhost6
aliases: localhost6.localdomain6
ip address: 127.0.0.1
*/
第14章 UDP编程(2)_端口绑定和域名解析的更多相关文章
- 第14章 UDP编程(1)_UDP客户端服务器模型
1. UDP编程模型 (1)UDP客户端服务器模型 ①客户端可以不调用bind()而直接与服务器通讯. ②UDP是无连接的,因此服务端不需要调用accept和listen,客户端也无需调用connec ...
- 第14章 UDP编程(3)_利用UDP实现广播功能
3. 广播的介绍 (1)广播 ①广播实现一对多的通信,如QQ群 ②它通过向广播地址发送数据报文实现的 (2)SO_BROADCAST选项 ①SO_BROADCAST选项控制着UDP套接字是否能发送广播 ...
- 《Android开发艺术探索》读书笔记 (13) 第13章 综合技术、第14章 JNI和NDK编程、第15章 Android性能优化
第13章 综合技术 13.1 使用CrashHandler来获取应用的Crash信息 (1)应用发生Crash在所难免,但是如何采集crash信息以供后续开发处理这类问题呢?利用Thread类的set ...
- 老李推荐:第14章1节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-面向控件编程VS面向坐标编程
老李推荐:第14章1节<MonkeyRunner源码剖析> HierarchyViewer实现原理-面向控件编程VS面向坐标编程 poptest是国内唯一一家培养测试开发工程师的培训机 ...
- 《mysql必知必会》学习_第14章_20180806_欢
第14章:使用子查询. 子查询是镶嵌在其他查询里面,相当其他的select查询的条件来. P91 select order_num from where prod_id='tnt2'; #检索条件 ...
- Windows核心编程:第14章 探索虚拟内存
Github https://github.com/gongluck/Windows-Core-Program.git //第14章 探索虚拟内存.cpp: 定义应用程序的入口点. // #inclu ...
- Linux就这个范儿 第14章 身在江湖
Linux就这个范儿 第14章 身在江湖 “有人的地方就有江湖”,如今的计算机世界就像一个“江湖”.且不说冠希哥有多么无奈,把微博当QQ的局长有多么失败,就说如此平凡的你我什么时候就成了任人摆布的羔羊 ...
- TODO:Golang语言TCP/UDP协议重用地址端口
TODO:Golang语言TCP/UDP协议重用地址端口 这是一个简单的包来解决重用地址的问题. go net包(据我所知)不允许设置套接字选项. 这在尝试进行TCP NAT时尤其成问题,其需要在同一 ...
- 《深入浅出Node.js》第7章 网络编程
@by Ruth92(转载请注明出处) 第7章 网络编程 Node 只需要几行代码即可构建服务器,无需额外的容器. Node 提供了以下4个模块(适用于服务器端和客户端): net -> TCP ...
随机推荐
- Jmeter实现MySQL的增删改查操作
环境: JDBC驱动:mysql-connector-java-5.1.7-bin Jmeter:Jmeter3.0 1.导入JDBC驱动:测试计划-->浏览-->选择mysql-conn ...
- Centos7 安装 MySQL5.7
Centos7 安装 MySQL5.7 一.环境介绍 1.安装包版本介绍 MySQL 有三种安装方式:RPM安装.二进制包安装.源码包安装.我们这篇文章以二进制方式安装MySQL 软件名称 版本 系统 ...
- golang多核的使用
实际上协程只是发生在单个进程内部的,要是想充分的发掘多核CPU的潜力,还是需要多进程的支持. 对于多核编程,go是天生支持,那么我们在什么情况下应该用多核心来加速程序,而在什么情况下用单核即可呢? 现 ...
- 关于XCode 的agvtool命令行
简介:用agvtool如何来自动更新版本号和bulid version agvtool是一个命令行工具,允许你自动递增到下一个最高的数量或具体的数字这些数字.本文档提供了更新您的构建和版本号码使用 ...
- 故障排查:vsftpd无法用浏览器访问
在CentOS6上搭建的ftp服务器,突然无法使用浏览器进行访问,但使用xftp等工具可以正常访问 想到之前修改过阿里云的安全组设置,推测可能有关 1)修改vsftpd的配置,手动指定被动模式的随机连 ...
- Nginx访问限制模块limit_conn_zone 和limit_req_zone配置使用
nginx可以通过limit_conn_zone 和limit_req_zone两个组件来对客户端访问目录和文件的访问频率和次数进行限制,另外还可以善用进行服务安全加固,两个模块都能够对客户端访问进行 ...
- 手把手图文教你eclipse下如何配置tomcat
很多初学,尤其自学JavaWeb的朋友首次在eclipse下配置tomcat时,总会有种难下手的感觉,在此,笔者通过图文解说的方法,最直观的向大家演示一遍该配置过程,希望对大家有所帮助. 注:本文是建 ...
- ASP.NET vNext:微软下一代云环境Web开发框架
作者 郭蕾 发布于 2014年5月16日 在5月12日的TechED大会上,微软首次向外界介绍了下一代ASP.NET框架——ASP.NET vNext.ASP.NET vNext专门针对云环境和服 ...
- C#中Task的使用简单总结
Task在并行计算中的作用很凸显,但是他的使用却有点小复杂,下面是任务的一些基本使用说明(转载与总结于多篇文章) 简单点说说吧! 创建 Task 创建Task有两种方式,一种是使用构造函数创建,另一种 ...
- 用复制mysql/data 文件夹 下面的数据库的形式来复制数据库出现的问题
用复制mysql/data 文件夹 下面的数据库的形式来复制数据库出现的问题 提示找不到表,我去看了一下,丢失了很多个表: 问题: 直接拷贝data下的数据库数据进行备份 , 发现部分数据表不见了. ...