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 编程 域名解析的更多相关文章

  1. Socket网络编程-UDP编程

    Socket网络编程-UDP编程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.UDP编程概述 1>.UDP服务端编程流程 创建socket对象.socket.SOCK_ ...

  2. 五十六、linux 编程——UDP 编程模型

    56.1 UDP 编程模型 56.1.1 编程模型 UDP 协议称为用户数据报文协议,可靠性比 TCP 低,但执行效率高 56.1.2 API (1)发送数据 函数参数: sockfs:套接字文件描述 ...

  3. 37 - 网络编程-UDP编程

    目录 1 UDP协议 2 UDP通信流程 3 UDP编程 3.1 构建服务端 3.3 常用方法 4 聊天室 5 UDP协议应用 1 UDP协议 UDP是面向无连接的协议,使用UDP协议时,不需要建立连 ...

  4. 五十八、linux 编程——UDP 编程 广播

    58.1 广播介绍 58.1.1 介绍 广播实现一对多的通讯 它通过向广播地址发送数据报文实现的 58.1.2 套接字选项 套接字选项用于修饰套接字以及其底层通讯协议的各种行为.函数 setsocko ...

  5. c++ 网络编程(五) LINUX下 socket编程 多种I/O函数 -以及readv和writev函数用法

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9614056.html 一.多种I/O函数 前言:之前我们讲的数据传输一般Linux上用writ ...

  6. linux下udp编程

    #include<sys/types.h> #include<sys/socket.h> #include<unistd.h> #include<netine ...

  7. 五十五 网络编程 UDP编程

    TCP是建立可靠连接,并且通信双方都可以以流的形式发送数据.相对TCP,UDP则是面向无连接的协议. 使用UDP协议时,不需要建立连接,只需要知道对方的IP地址和端口号,就可以直接发数据包.但是,能不 ...

  8. UNIX网络编程——UDP编程模型

    使用UDP编写的一些常见得应用程序有:DNS(域名系统),NFS(网络文件系统)和SNMP(简单网络管理协议). 客户不与服务器建立连接,而是只管使用sendto函数给服务器发送数据报,其中必须指定目 ...

  9. 网络编程——UDP编程

    一个简单的聊天代码:运行结果: 在这个程序之中,由于recvfrom函数拥塞函数,没有数据时会一直阻塞,所以客户端和服务器端只能通过一回一答的方式进行信息传递.严格的讲UDP没有明确的客户端和服务端, ...

随机推荐

  1. 经度和纬度在SQL中的数据类型

    冬天太冷,等坐公司班车也很冷,就萌生了给班车做一个到站查询功能. 在某宝上买了汽车在线的GPS设备, 终生免费的服务的. 这里不得不提下这个设备的优点, 它提供API接口,还是免费的. 所以在班车上装 ...

  2. Django-1- urls的路由配置, 命名, 重定向, path及re_path

    1-项目目录下配置(path方法) 这里的访问路径可以是127.0.0.1:8000/index/      2-APP目录下配置(path方法) 这里的访问路径可以是127.0.0.1:8000/t ...

  3. windows docker redis

    拉取docker docker pull hub.c.163.com/library/redis:latest 启动docker docker run -p 6379:6379 -d hub.c.16 ...

  4. 配置安全的管理访问(GNS3)

    实验拓扑: 实验目的: 尝试用R2/R3远程登陆R1路由器并进行管理,在此之前先在R1配置安全的管理访问 1.端口IP配置 R1: e1/0 192.168.1.1/24 e1/1 192.168.2 ...

  5. python学习——读取染色体长度(六:读取含有染色体长度的文件)

    含有染色体长的文件chr_len.txt chr1 10chr2 20chr3 30chr4 40chr5 50 python脚本 #传递命令行参数 import sys # 导入模块 # 从命令行获 ...

  6. Facebook 广告投放相关概念简介(1)

    本文不涉及具体代码实现,仅对开发API的前置内容做简单介绍,想参考代码请绕行! 广告主(广告管理工具) ·需要推广自己的应用.网站.主页,所以有了广告管理工具 . ·一个广告主仅可拥有一个广告账户(可 ...

  7. ABP之模块系统

    简介 ASP.NET Boilerplate提供了构建模块的基础结构,并将它们组合在一起以创建应用程序. 模块可以依赖于另一个模块. 通常,一个程序集被视为一个模块. 如果创建具有多个程序集的应用程序 ...

  8. git错集

    2018年12月20日22:26:01 fatal:not a git repository ( or any of the parent directories ) : .git 这个错误出现在首次 ...

  9. promise源码解析

    前言 大部分同学对promise,可能还停留在会使用es6的promise,还没有深入学习.我们都知道promise内部通过reslove.reject来判断执行哪个函数,原型上面的then同样的,也 ...

  10. 你懂redis吗

    一.redis简介 Redis是当前比较热门的NOSQL系统之一,它是一个开源的使用ANSI c语言编写的key-value存储系统(区别于MySQL的二维表格的形式存储.).和Memcache类似, ...