五十七、linux 编程——UDP 编程 域名解析
57.1 介绍
57.1.1 域名解析

57.1.2 域名解析函数

gethostent 可以获取多组,gethostbyname 只可以获取一组
/etc/hosts 文件设置了域名和 IP 的绑定关系


57.2 例子
57.2.1 例子1
gethost.c
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <arpa/inet.h> 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));
printf("ip address: %s\n", ip); int i = ;
while(h->h_aliases[i] != NULL){
printf("aliase: %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( NULL != h){
out_addr(h);
}
else{
perror("get hostbyname error");
} return ;
}
修改下 /etc/hosts 文件,给 localhost 增加一个别名

编译运行:

gethostbyname 有一些缺陷,支持 IPV4 但是不支持 IPV6,且不能用于多线程中。
57.2.2 例子2
gethost2.c
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <arpa/inet.h> 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));
printf("ip address: %s\n", ip); int i = ;
while(h->h_aliases[i] != NULL){
printf("aliase: %s\n", h->h_aliases[i]);
i++;
}
} int main(int argc, char *argv[])
{
if(argc < ){
fprintf(stderr, "usage: %s host\n", argv[]);
exit();
} struct hostent *h;
while((h = gethostent()) != NULL){
if(!strcmp(argv[], h->h_name)){
out_addr(h);
exit();
}
else{
int i = ;
while(h->h_aliases[i] != NULL){
if(!strcmp(argv[], h->h_aliases[i])){
out_addr(h);
exit();
}
i++;
}
}
} endhostent();
printf("no %s exist\n", argv[]); return ;
}
编译运行:

57.2.3 例子3
修改前面 time_udp_client.c 文件
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <string.h>
#include <time.h> int is_host(struct hostent *host, char *name)
{
if(!strcmp(host->h_name, name)) return ;
int i = ;
while(host->h_aliases[i] != NULL){
if(!strcmp(host->h_aliases[i], name)) return ;
i++;
} return ;
} unsigned int get_ip_by_name(char *name)
{
unsigned int ip = ;
struct hostent *host;
while((host = gethostent()) != NULL){
if(is_host(host, name)){
memcpy(&ip, host->h_addr_list[], );
break;
}
} endhostent();
return ip;
} int main(int argc, char *argv[])
{
if(argc < ){
printf("usage: %s ip port\n", argv[]);
exit();
} /** 步骤1: 创建 socket */
int sockfd = socket(AF_INET, SOCK_DGRAM, );
if(sockfd < ){
perror("socket error");
exit();
} /** 步骤2: 调用 recvfrom 和 sendto 等函数和服务器端双向通信 */
struct sockaddr_in serveraddr;
memset(&serveraddr, , sizeof(serveraddr));
serveraddr.sin_family = AF_INET; ///< ipv4
serveraddr.sin_port = htons(atoi(argv[2])); ///< port unsigned int ip = get_ip_by_name(argv[]);
if(ip != ){
serveraddr.sin_addr.s_addr = ip;
}
else {
inet_pton(AF_INET, argv[], &serveraddr.sin_addr.s_addr);
} char buffer[] = "hello world";
/** 向服务器端发送数据报文 */
if(sendto(sockfd, buffer, sizeof(buffer), , (struct sockaddr*)&serveraddr, sizeof(serveraddr)) < ){
perror("sendto error");
exit();
}
else{
/** 接受服务器端发送的数据报文 */
memset(buffer, , sizeof(buffer));
if(recv(sockfd, buffer, sizeof(buffer), ) < ){
perror("recv error");
exit();
}
else{
printf("%s", buffer);
}
} close(sockfd); return ;
}
编译,运行服务器和客户端测试:

五十七、linux 编程——UDP 编程 域名解析的更多相关文章
- Socket网络编程-UDP编程
Socket网络编程-UDP编程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.UDP编程概述 1>.UDP服务端编程流程 创建socket对象.socket.SOCK_ ...
- 五十六、linux 编程——UDP 编程模型
56.1 UDP 编程模型 56.1.1 编程模型 UDP 协议称为用户数据报文协议,可靠性比 TCP 低,但执行效率高 56.1.2 API (1)发送数据 函数参数: sockfs:套接字文件描述 ...
- 37 - 网络编程-UDP编程
目录 1 UDP协议 2 UDP通信流程 3 UDP编程 3.1 构建服务端 3.3 常用方法 4 聊天室 5 UDP协议应用 1 UDP协议 UDP是面向无连接的协议,使用UDP协议时,不需要建立连 ...
- 五十八、linux 编程——UDP 编程 广播
58.1 广播介绍 58.1.1 介绍 广播实现一对多的通讯 它通过向广播地址发送数据报文实现的 58.1.2 套接字选项 套接字选项用于修饰套接字以及其底层通讯协议的各种行为.函数 setsocko ...
- c++ 网络编程(五) LINUX下 socket编程 多种I/O函数 -以及readv和writev函数用法
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9614056.html 一.多种I/O函数 前言:之前我们讲的数据传输一般Linux上用writ ...
- linux下udp编程
#include<sys/types.h> #include<sys/socket.h> #include<unistd.h> #include<netine ...
- 五十五 网络编程 UDP编程
TCP是建立可靠连接,并且通信双方都可以以流的形式发送数据.相对TCP,UDP则是面向无连接的协议. 使用UDP协议时,不需要建立连接,只需要知道对方的IP地址和端口号,就可以直接发数据包.但是,能不 ...
- UNIX网络编程——UDP编程模型
使用UDP编写的一些常见得应用程序有:DNS(域名系统),NFS(网络文件系统)和SNMP(简单网络管理协议). 客户不与服务器建立连接,而是只管使用sendto函数给服务器发送数据报,其中必须指定目 ...
- 网络编程——UDP编程
一个简单的聊天代码:运行结果: 在这个程序之中,由于recvfrom函数拥塞函数,没有数据时会一直阻塞,所以客户端和服务器端只能通过一回一答的方式进行信息传递.严格的讲UDP没有明确的客户端和服务端, ...
随机推荐
- Exchange 2010邮件服务器的搭建和部署
Exchange主要是针对内部网或者企业网用户进行搭建的邮件服务器软件,利用它能够很快地搭建安全性较高的内部网邮件系统. 本次搭建在个人环境中实践,纯属爱好折腾,分四步骤,1.搭建windows 20 ...
- UOJ #449. 【集训队作业2018】喂鸽子
UOJ #449. [集训队作业2018]喂鸽子 小Z是养鸽子的人.一天,小Z给鸽子们喂玉米吃.一共有n只鸽子,小Z每秒会等概率选择一只鸽子并给他一粒玉米.一只鸽子饱了当且仅当它吃了的玉米粒数量\(≥ ...
- Python支付宝在线支付API
一.蚂蚁金服开发平台申请测试账号 a. 登陆蚂蚁金服开放平台https://open.alipay.com/platform/manageHome.htm,在“开发中心”—“研发服务”下拉处选择沙箱作 ...
- NW.js使用及打包
简介 NW.js (原名 node-webkit)是一个结合了 Chromium 和 node.js 的应用运行时,通过它可以用 HTML 和 JavaScript 编写原生应用程序.它还允许开发者从 ...
- PyCharm中Django项目主urls导入应用中views的红线问题
PyCharm中Django项目主urls导入应用中views的红线问题 使用PyCharm学习Django框架,从项目的主urls中导入app中的views的时候,导入的包中下面有红线报错,但是却能 ...
- Docker 核心技术之镜像
镜像简介 镜像是一个Docker的可执行文件,其中包括运行应用程序所需的所有代码内容.依赖库.环境变量和配置文件等. 通过镜像可以创建一个或多个容器. 镜像搜索 - docker search 作用: ...
- laravel 多条件查询
select * from homework where (id between 1 and 10 or id between 50 and 70) and complete = 1 and (tit ...
- android AVD 启动时报错
AVD启动报错 1.提示:ANDROID_SDK_ROOT is undefined / ERROR: This AVD’s configuration is missing a kernel fil ...
- spring多模块项目手动整合
一.分别创建parent entity dao service controller web等模块项目,如图: 二.parent项目添加依赖 <!-- 集中定义依赖版本号 --> < ...
- Spring-webflow基础讲解
什么是webflow: Spring Web Flow构建于Spring MVC之上,允许实现Web应用程序的“流程”.流程封装了一系列步骤,指导用户执行某些业务任务.它跨越多个HTTP请求,具有状态 ...