arm开发板下运行时请确认你的开发板已联网
cat /etc/resolv.conf是否为空

urlIpTest_main.c


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <netinet/ip_icmp.h>    //
#include <netdb.h>      // gethostbyname, gethostbyname2, gethostbyname_r, gethostbyname_r2
#include <setjmp.h>
#include <errno.h>#include <fcntl.h>      // 非阻塞关键字
#include <stdbool.h>    // 使用bool变量
#include <pthread.h>    // 使用多线程void delayus(unsigned int us)
{struct timeval tim;tim.tv_sec = us/1000000;tim.tv_usec = us%1000000;select(0, NULL, NULL, NULL, &tim);
}////////////////////////////////// 域名转IP ////////////////////////////////// // 封装个和线程交互用的结构体
typedef struct{pthread_t thread_id;char ip[256];bool result;bool actionEnd;
}GetHostName_Struct;// 调用 gethostbyname_r 函数需在单独的线程中调用, 阻塞时还可以外部超时退出
void *getHost_fun(void *arge)
{int ret;int i;char buf[1024];struct hostent host_body, *host;struct in_addr **addr_list;GetHostName_Struct *gs = (GetHostName_Struct *)arge;/*  此类方法不可重入!  即使关闭线程if((host = gethostbyname(gs->ip)) == NULL)//if((host = gethostbyname2(gs->ip, AF_INET)) == NULL){gs->actionEnd = true;return NULL;}*/if(gethostbyname_r(gs->ip, &host_body, buf, sizeof(buf), &host, &ret)){gs->actionEnd = true;return NULL;}if(host == NULL){gs->actionEnd = true;return NULL;}addr_list = (struct in_addr **)host->h_addr_list;// 查看获得的ip列表/*printf("ip name : %s\r\nip list : ", host->h_name);for(i = 0; addr_list[i] != NULL; i++) printf("%s, ", inet_ntoa(*addr_list[i])); printf("\r\n");*/// 默认返回列表第一条ipif(addr_list[0] == NULL){gs->actionEnd = true;return NULL;}memset(gs->ip, 0, sizeof(gs->ip));strcpy(gs->ip, (char *)inet_ntoa(*addr_list[0]));gs->result = true;gs->actionEnd = true;return NULL;
}// 封装方法, 成功返回调用耗时, 错误返回负数的耗时  (ms)
int getIpFromHostName(char *hostName, char *backIp)
{int i, timeOut = 1;GetHostName_Struct gs;if(hostName == NULL)return -1;else if(strlen(hostName) < 1)return -1;//----- 开线程从域名获取IP -----memset(&gs, 0, sizeof(GetHostName_Struct));strcpy(gs.ip, hostName);gs.result = false;gs.actionEnd = false;if (pthread_create(&gs.thread_id, NULL, getHost_fun, &gs) < 0)return -1;i = 0;while(!gs.actionEnd){if(++i > 10){i = 0;if(++timeOut > 1000)    // 1s 超时break;}delayus(1000);// 1ms延时}//pthread_cancel(gs.thread_id);//必须让系统跑完,否则内存不能释放pthread_join(gs.thread_id, NULL);if(!gs.result)return -timeOut;//----- 开线程从域名获取IP -----memset(backIp, 0, strlen(backIp));strcpy(backIp, gs.ip);return timeOut;
}////////////////////////////////// 域名转IP ////////////////////////////////// int main(int argc, char *argv[])
{char ip[128] = {0};int ret;//if(argc < 2){printf("input such as : ./urlIpTest www.baidu.com\r\n");return 0;}//if((ret = getIpFromHostName(argv[1], ip)) > 0)printf("host(%s) to ip(%s) , ret/%d\r\n", argv[1], ip, ret);elseprintf("test failed , ret/%d\r\n", ret);//return 0;
}// 在tcp连接时的使用
/*
...
{...struct sockaddr_in sock_addr;memset(&sock_addr,0,sizeof(sock_addr));sock_addr.sin_family=AF_INET;//获取IP不成功时可尝试调用域名转换if((sock_addr.sin_addr.s_addr = inet_addr(ip)) == INADDR_NONE){//printf("url is : %s\r\n", ip);//memset(buf, 0, sizeof(buf));ret = getIpFromHostName(ip, buf);if(ret < 0)return ret;else if(strlen(buf) < 7)return -ret;//if((sock_addr.sin_addr.s_addr = inet_addr(buf)) == INADDR_NONE)return -ret;printf("Host(%s) to Ip(%s)\r\n", ip, buf);}...
}
*/

Makefile:

#CC=arm-linux-gnueabihf-
CC=
target:$(CC)gcc -O3 -o urlIpTest urlIpTest_main.c -lpthread
clean:@rm -rf urlIpTest

Linux下c实现域名转IP的方法封装相关推荐

  1. python在windows和linux_python在windows和linux下获得本机本地ip地址方法小结

    本文实例总结了python在windows和linux下获得本机本地ip地址方法.分享给大家供大家参考.具体分析如下: python的socket包含了丰富的函数和方法可以获得本机的ip地址信息,so ...

  2. linux下桥接模式设置静态IP实现上网

    桥接网络连接模式的虚拟机就当作主机所在以太网的一部分,虚拟系统和宿主机器的关系,就像连接在同一个Hub上的两台电脑,可以像主机一样可以访问以太网中的所有共享资源和网络连接,可以直接共享主机网络的互联网 ...

  3. linux 端口限速技术,linux下如何实现对每个IP进行限制带宽??

    linux下如何实现对每个IP进行限制带宽?? (2011-09-01 01:03:54) 标签: 杂谈 linux下如何实现对每个IP进行限制带宽??redhat linux服务器,最近发现单位的网 ...

  4. Linux下使用 ipset 封大量IP及ipset参数说明

    转载Linux下使用 ipset 封大量IP及ipset参数说明 Linux使用iptables封IP,是常用的应对网络攻击的方法,但要封禁成千上万个IP,如果添加成千上万条规则,对机器性能影响较大, ...

  5. Linux下基于密钥的安全验证实现方法

    Linux下基于密钥的安全验证实现方法 -------OpenSSH+WinSCP+putty密钥生成器+putty 实验背景: 小诺公司目前已使用Linux搭建了各个服务器(FTP.DNS.Apac ...

  6. Linux 下的NFS server 架设基础及方法

    Linux 下的NFS server 架设基础及方法<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office: ...

  7. linux udp 端口测试,RAKsmart:Linux下TCP/UDP 端口测试及验证方法说明

    RAKsmart:Linux下TCP/UDP 端口测试及验证方法说明2020-06-11 在 Linux 系统中,有时需要在系统中测试端口的连通性,以便确认系统的TCP.UDP协议栈是否可以正常运行. ...

  8. linux查看进程占句柄,linux下查看系统进程占用的句柄数方法

    linux下查看系统进程占用的句柄数方法 ---查看系统默认的最大文件句柄数,系统默认是1024 # ulimit -n 1024 ----查看当前进程打开了多少句柄数 # lsof -n|awk ' ...

  9. linux 开通udp 端口号,Linux 下 TCP/UDP 端口测试及验证方法说明

    Linux 下 TCP/UDP 端口测试及验证方法说明 在云服务器 ECS Linux 系统中,有时需要在系统中测试端口的连通性,以便确认系统的TCP.UDP协议栈是否可以正常运行.本文对此进行简要说 ...

最新文章

  1. eclipse运行程序时只有run on server
  2. Powershell管理系列(二十八)PowerShell操作之修改AD账号密码
  3. Android在listview添加checkbox实现单选多选操作问题
  4. photoshop(ps) cs6中文版
  5. drupal linux安装,在Debian 10(Buster) Linux服务器中安装drupal 8.8.0的说明
  6. win7服务器端口被占用,高手亲自帮您win7端口被占用的详尽处理要领
  7. Two.js – 为现代浏览器而生的 2D 绘图 API
  8. 图 邻接表 建立 深度遍历 广度遍历
  9. spring多个AOP执行先后顺序(面试问题:怎么控制多个aop的执行循序)
  10. 小米距告别破发还差2分钱
  11. java如何读取文本,Java:如何读取文本文件
  12. 计算DataTable某列的值(SUM)
  13. Matlab二维图导入ansys,(原创教程)利用Matlab对ANSYS数据进行后处理.pdf
  14. 服务器是怎么响应服务器的细节,我怎样才能得到响应从Web服务器
  15. 2020秋招阿里测试开发一面
  16. 李欣桐 计算机竞赛,思维角逐 以赛促学 ——记义乌枫叶小学部第四届计算“小能手”比赛...
  17. 元旦有什么国产蓝牙耳机推荐?2022音质好的蓝牙耳机选购指南
  18. TX2/Linux下can总线的接收与发送详解!(回环测试)
  19. jmpi 与ljmp指令分析
  20. Android有用代码(一)

热门文章

  1. 服务器虚拟化令CIO们人心碎 超融合是解药吗?
  2. Cef: 3.2623.1401.gb90a3be开启ppapi flash插件
  3. 【k8s】报错解决:Error from server (BadRequest): a container name must be specified for pod choose one of
  4. 华为鸿蒙系统不用在手机上,华为鸿蒙系统发布!但你知道吗?其实它早就在这手机里初露锋芒了...
  5. 计算机毕设 SpringBoot+Vue在线音乐系统 音乐推荐系统 音乐管理系统 音乐播放管理系统Java Vue MySQL数据库 远程调试 代码讲解
  6. 取消iview UI框架的Radio选中状态
  7. 4个别人都爱用的微信小程序,快来亲自体验一下啦!
  8. AI正在往哪里去?这有一份来自腾讯AI Lab的2018答卷
  9. 3节点Fate集群实战记录 -- 纵向联邦学习
  10. 安卓打开串口失败 java.io.IOException: Error running exec(). Command: [/system/xbin/su] Working Directory: nu