LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2774|回复: 12

Linux下的C编程怎样获取本机的IP地址?

[复制链接]
发表于 2005-7-9 20:48:44 | 显示全部楼层 |阅读模式
Linux下C语言编程,怎样才能获得本机的IP地址,用什么函数或宏?
该怎么编?哪位高手知道?盼尽快告知.
发表于 2005-7-9 22:23:47 | 显示全部楼层
#include <netdb.h>

server_host_name=gethostbyname(host_name);
((struct in_addr *)(server_host_name->h_addr))->s_addr
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-7-9 22:31:44 | 显示全部楼层
((struct in_addr *)(server_host_name->h_addr))->s_addr这个就是IP地址吗
回复 支持 反对

使用道具 举报

发表于 2005-7-9 23:50:48 | 显示全部楼层
搜索论坛
回复 支持 反对

使用道具 举报

发表于 2005-7-10 11:48:04 | 显示全部楼层
精华区看一下
回复 支持 反对

使用道具 举报

发表于 2005-7-10 12:05:12 | 显示全部楼层
请问精华区在哪里:(
回复 支持 反对

使用道具 举报

发表于 2005-7-10 12:17:51 | 显示全部楼层
Post by libinyiyi
请问精华区在哪里:(
晕,我看你也发了蛮多帖嘛 :confused:  :confused:  :confused:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-7-10 20:47:58 | 显示全部楼层
还是不知道怎么编,哪位写一下完整的源代码?
回复 支持 反对

使用道具 举报

发表于 2005-7-10 22:06:45 | 显示全部楼层
仅仅适用IPv4,代码一定很幼稚,请大家指教啊!
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/types.h>
  4. #include <sys/socket.h>
  5. #include <sys/ioctl.h>
  6. #include <netinet/in.h>
  7. #include <net/if.h>
  8. #include <net/if_arp.h>
  9. #include <arpa/inet.h>
  10. #include <errno.h>
  11. #include <unistd.h>
  12. #include <net/route.h>
  13. #include <string.h>

  14. typedef struct
  15. {
  16.   char name[16];
  17.   char address[16];
  18.   char netmask[16];
  19.   char broadcast[16];  
  20.   char macaddr[18];
  21. }if_info;

  22. int read_if_info(if_info* info, size_t* len)
  23. {
  24.   int fd;
  25.   int numreqs = 6;
  26.   struct ifconf ifc;
  27.   struct ifreq *ifr;
  28.   int n;
  29.   int idx = 0;
  30.   int size;
  31.   
  32.   size = *len;

  33.   fd = socket(AF_INET, SOCK_DGRAM, 0);

  34.   memset(&ifc, 0, sizeof(struct ifconf));
  35.   ifc.ifc_len = sizeof(struct ifreq) * numreqs;
  36.   ifc.ifc_buf = (char*)malloc(ifc.ifc_len);

  37.   do {
  38.     if (ioctl(fd, SIOCGIFCONF, &ifc) < 0) {
  39.       //perror("SIOCGIFCONF");
  40.       goto err;
  41.     }
  42.     if (ifc.ifc_len == sizeof(struct ifreq) * numreqs) {
  43.       /* assume it overflowed and try again */
  44.       numreqs += 4;
  45.       ifc.ifc_len = sizeof(struct ifreq) * numreqs;
  46.       ifc.ifc_buf = (char*)realloc(ifc.ifc_buf, ifc.ifc_len);
  47.       continue;
  48.     }
  49.     break;
  50.   }while(1);

  51.   ifr = ifc.ifc_req;

  52.   for (n = 0; n < ifc.ifc_len; n += sizeof(struct ifreq)) {
  53.     if (idx >= size){
  54.       goto end;
  55.     }       
  56.    
  57.     strcpy(info[idx].name, ifr->ifr_name);
  58.     strcpy(info[idx].address,
  59.            inet_ntoa(((struct sockaddr_in*)&ifr->ifr_addr)->sin_addr));
  60.                
  61.     if (ioctl(fd, SIOCGIFNETMASK, ifr) < 0)         {
  62.       goto err;
  63.     }

  64.     strcpy(info[idx].netmask,
  65.            inet_ntoa(((struct sockaddr_in*)&ifr->ifr_netmask)->sin_addr));
  66.                
  67.     if (ioctl(fd, SIOCGIFBRDADDR, ifr) < 0)         {
  68.       goto err;
  69.     }

  70.     strcpy(info[idx].broadcast,
  71.            inet_ntoa(((struct sockaddr_in*)&ifr->ifr_broadaddr)->sin_addr));
  72.                
  73.     if (ioctl(fd, SIOCGIFHWADDR, ifr) < 0)         {
  74.       goto err;
  75.     }                                
  76.     sprintf(info[idx].macaddr, "%02X:%02X:%02X:%02X:%02X:%02X",(unsigned char)ifr->ifr_hwaddr.sa_data[0],\
  77.             (unsigned char)ifr->ifr_hwaddr.sa_data[1],(unsigned char)ifr->ifr_hwaddr.sa_data[2],\
  78.             (unsigned char)ifr->ifr_hwaddr.sa_data[3],(unsigned char)ifr->ifr_hwaddr.sa_data[4],\
  79.             (unsigned char)ifr->ifr_hwaddr.sa_data[5]);       
  80.     ifr++;
  81.     idx++;
  82.   }

  83.   

  84. end:
  85.   free(ifc.ifc_buf);
  86.   *len = idx;
  87.   return 0;

  88. err:
  89.   free(ifc.ifc_buf);       
  90.   
  91.   return -1;       
  92.   
  93. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-7-10 22:30:02 | 显示全部楼层
怎么这么麻烦,有没有简单一点的,代码太长了,大家帮忙看一下这段代码该怎么改:
    struct hostent *h;
    char *host_name;
    char *local_ip;

   if((gethostname(host_name,200))==-1){
           herror(" get host name");
           exit(1);
          }         
   if ((h=gethostbyname(host_name))==NULL) { /* get the host info */
       herror(" get host byname");
       exit(1);
       }
    printf("Host name : %s\n", h->h_name);     
    local_ip=(char*)((struct in_addr *)h->h_addr);
    printf("IP Address : %s\n",local_ip);
  编译能通过,但执行后得不到结果?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表