五十七、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没有明确的客户端和服务端, ...
随机推荐
- RocketMQ4.3.X关于设置useEpollNativeSelector = true报错问题
前一阵子刚整理完RocketMQ4.3.x版本的相关配置的工作,接下来就来测试一下改变参数会带来什么好的结果 首先我就选中了useEpollNativeSelector 这个参数 默认这个参数是 fa ...
- c文件操作整理
<c陷阱与缺陷> FILE *fp; fp = fopen(file, "r+"); 编程者也许认为,程序一旦执行上述操作完毕,就可以自由地进行读取和写入的操作了.遗憾 ...
- CSS动画总结与呼吸灯效果
首先,先介绍一下主要用到的css属性:animation,text-shadow. text-shadow就不再介绍了,上一篇已经详细介绍了用法.这里先介绍一下animation属性. 1.anima ...
- Linux云计算运维-MySQL
0.建初心 优秀DBA的素质 1.人品,不做某些事情2.严谨,运行命令前深思熟虑,三思而后行,即使是依据select3.细心,严格按照步骤一步一步执行,减少出错4.心态,遇到灾难,首先要稳住,不慌张, ...
- Jenkins + Ansible + Gitlab之gitlab篇
前言 持续交付 版本控制器:Gitlab.GitHub 持续集成工具:jenkins 部署工具:ansible 课程安排 Gitlab搭建与流程使用 Ansible环境配置与Playbook编写规范 ...
- 了解基本的bash shell命令
本节内容主要介绍如何使用bash shell提供的基本命令处理Linux文件和目录: 1.启动shell shell是一个可以交互访问的Linux系统程序,它的运行与普通程序相同,系统启动的shell ...
- Python协程的引入与原理分析
相关概念 并发:指一个时间段内,有几个程序在同一个cpu上运行,但是任意时刻只有一个程序在cpu上运行.比如说在一秒内cpu切换了100个进程,就可以认为cpu的并发是100. 并行:值任意时刻点上, ...
- selenium中隐式等待和显示等待的区别
Selenium显示等待和隐式等待的区别1.selenium的显示等待原理:显示等待,就是明确的要等到某个元素的出现或者是某个元素的可点击等条件,等不到,就一直等,除非在规定的时间之内都没找到,那么久 ...
- beanshell断言模版
if("${createTime_1}".equals("${createTime_2}")){ Failure = false; FailureMessage ...
- list遍历时删除的坑
1.测试代码如下: public class StrTest { public static void main(String[] args) { ArrayList<String> li ...