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 Server阻塞案例分析

    上周,在SQL Server数据库下面遇到了一个有意思的SQL阻塞(SQL Blocking)案例.其实个人对SQL Server的阻塞还是颇有研究的.写过好几篇相关文章. 至于这里为什么要总结一下这 ...

  2. Ant Design Pro+Electron+electron-builder实现React应用脱离浏览器,桌面安装运行

    ant-design-pro ----> version :2.3.1 由于网上Ant Design Pro+Electron的资料太少,我就贡献一点经验   最近需要讲AntD Pro项目(以 ...

  3. ASP.NET Core 2.2 十九. Action参数的映射与模型绑定

    前文说道了Action的激活,这里有个关键的操作就是Action参数的映射与模型绑定,这里即涉及到简单的string.int等类型,也包含Json等复杂类型,本文详细分享一下这一过程.(ASP.NET ...

  4. 浅谈 C# SQL防注入

    1#region 防止sql注入式攻击(可用于UI层控制)  2  3///   4/// 判断字符串中是否有SQL攻击代码  5///   6/// 传入用户提交数据  7/// true-安全:f ...

  5. C# 菜单之递归算法

    今天因为菜单的问题, 需要用到递归算法, 在此记录一下: 1.表结构如下:(这里只是展示两个比较重要的字段) ,大家应该都看明白 2.先定义一个菜单结构类. 3.实现递归. private List& ...

  6. 遍历HashMap的四种方式

    转至:https://www.cnblogs.com/Berryxiong/p/6144086.html public static void main(String[] args) { Map< ...

  7. pycharm .sqlite文件拖动到Database里面为空

    pycharm .sqlite文件拖动到Database里面为空 查资料得到解决方法:

  8. Centos6.5-DHCPServer安装

    1.查询dhcp有没有被安装,如下没有被安装 [zfp@localhost ~]$ rpm -q dhcppackage dhcp is not installed[zfp@localhost ~]$ ...

  9. mysql 索引中的USING BTREE 的意义

    索引是在存储引擎中实现的,因此每种存储引擎的索引都不一定完全相同,并且每种存储引擎也不一定支持所有索引类型. 根据存储引擎定义每个表的最大索引数和最大索引长度.所有存储引擎支持每个表至少16个索引,总 ...

  10. CentOS7切换源

    1.备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 2.下载新的CentOS-Base ...