#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h> #include <netdb.h>
#include <net/if.h>
#include <arpa/inet.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/socket.h> #define MAC_SIZE 18
#define IP_SIZE 16 // function declare
int get_ip_by_domain(const char *domain, char *ip); // 根据域名获取ip
int get_local_mac(const char *eth_inf, char *mac); // 获取本机mac
int get_local_ip(const char *eth_inf, char *ip); // 获取本机ip /****** main test **********/
int main(void)
{
char ip[IP_SIZE];
char mac[MAC_SIZE];
const char *test_domain = "www.baidu.com";
const char *test_eth = "eth0"; get_ip_by_domain(test_domain, ip);
printf("%s ip: %s\n", test_domain, ip); get_local_mac(test_eth, mac);
printf("local %s mac: %s\n", test_eth, mac); get_local_ip(test_eth, ip);
printf("local %s ip: %s\n", test_eth, ip); return 0;
} // 根据域名获取ip
int get_ip_by_domain(const char *domain, char *ip)
{
char **pptr;
struct hostent *hptr; hptr = gethostbyname(domain);
if(NULL == hptr)
{
printf("gethostbyname error for host:%s/n", domain);
return -1;
} for(pptr = hptr->h_addr_list ; *pptr != NULL; pptr++)
{
if (NULL != inet_ntop(hptr->h_addrtype, *pptr, ip, IP_SIZE) )
{
return 0; // 只获取第一个 ip
}
} return -1;
} // 获取本机mac
int get_local_mac(const char *eth_inf, char *mac)
{
struct ifreq ifr;
int sd; bzero(&ifr, sizeof(struct ifreq));
if( (sd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
printf("get %s mac address socket creat error\n", eth_inf);
return -1;
} strncpy(ifr.ifr_name, eth_inf, sizeof(ifr.ifr_name) - 1); if(ioctl(sd, SIOCGIFHWADDR, &ifr) < 0)
{
printf("get %s mac address error\n", eth_inf);
close(sd);
return -1;
} snprintf(mac, MAC_SIZE, "%02x:%02x:%02x:%02x:%02x:%02x",
(unsigned char)ifr.ifr_hwaddr.sa_data[0],
(unsigned char)ifr.ifr_hwaddr.sa_data[1],
(unsigned char)ifr.ifr_hwaddr.sa_data[2],
(unsigned char)ifr.ifr_hwaddr.sa_data[3],
(unsigned char)ifr.ifr_hwaddr.sa_data[4],
(unsigned char)ifr.ifr_hwaddr.sa_data[5]); close(sd); return 0;
} // 获取本机ip
int get_local_ip(const char *eth_inf, char *ip)
{
int sd;
struct sockaddr_in sin;
struct ifreq ifr; sd = socket(AF_INET, SOCK_DGRAM, 0);
if (-1 == sd)
{
printf("socket error: %s\n", strerror(errno));
return -1;
} strncpy(ifr.ifr_name, eth_inf, IFNAMSIZ);
ifr.ifr_name[IFNAMSIZ - 1] = 0; // if error: No such device
if (ioctl(sd, SIOCGIFADDR, &ifr) < 0)
{
printf("ioctl error: %s\n", strerror(errno));
close(sd);
return -1;
} memcpy(&sin, &ifr.ifr_addr, sizeof(sin));
snprintf(ip, IP_SIZE, "%s", inet_ntoa(sin.sin_addr)); close(sd);
return 0;
}

最新文章

  1. 在iIBatis中使用MySql中出现的配置问题
  2. 根据UIColor对象,获取对应的RGBA值
  3. Objective-C 随机数
  4. (原)android中的动画(二)
  5. Docker上运行dotnet core
  6. Memcached 笔记与总结(1)Linux(CentOS 6.6) 和 Windows(7)下安装与配置 Memcached (1.4.24)与 Memcached 基础命令
  7. NekoHTML
  8. ios开发学习- 简易音乐播放器2 (基于iPhone4s屏幕尺寸)-- 歌词解析--plist文件应用--imageNamed图片加载耗内存
  9. 【LeetCode练习题】Scramble String
  10. Min Stack (LeetCode) tweak it to avoid Memory Limit Exceeded
  11. OOP中的多态
  12. Java Evaluate Reverse Polish Notation(逆波兰式)
  13. Android消息推送之GCM方式(一)
  14. Ambari安装之Ambari安装前准备(CentOS6.5)(一)
  15. gRPC 如何使用python表示多维数组
  16. vue 中的通过搜索框进行数据过滤的过程
  17. git的操作集合
  18. 2019-04-03 研究EasyWeb有感
  19. 日积月累---JVM01
  20. java实现带空格字符串的倒序输出

热门文章

  1. 为部门整理的mysql_db使用军规
  2. Android 应用按返回键异常退出的问题
  3. phpstorm安装和调试
  4. Codeforces Round #272 (Div. 2) Dreamoon and WiFi 暴力
  5. Dictionary&lt;string, string&gt;是一个泛型使用说明
  6. luogu 3383【模板】线性筛素数
  7. MySQL 字符编码问题详细解释
  8. Android Studio笔记
  9. robotframework - 介绍&amp;应用
  10. InterferenceSignal-----------挺简单的 一道题 就是英语不好