linux系统下获取IP,MAC,子网掩码,网关

添加对应头文件

#include<stdio.h>
#include <cstdlib>
#include<string.h>
#include<unistd.h>
#include <fstream>
#include<iostream>
#include <net/if.h>
#include <sys/ioctl.h>
#include <arpa/inet.h>
#include <errno.h>
#include <linux/rtnetlink.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/utsname.h>
#include <limits.h>
#include <ctype.h>
#include <linux/sockios.h>

获取IP和子网掩码

int getLocalInfo(char IP[],char Mask[])
{
   int fd;
   int interfaceNum = 0;
   struct ifreq buf[16];
   struct ifconf ifc;
   struct ifreq ifrcopy;
   char mac[16] = {0};
   char ip[32] = {0};
   char broadAddr[32] = {0};
   char subnetMask[32] = {0};
   if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
   {
      perror("socket");
      close(fd);
      return -1;
   }
   ifc.ifc_len = sizeof(buf);
   ifc.ifc_buf = (caddr_t)buf;
   if (!ioctl(fd, SIOCGIFCONF, (char *)&ifc))
   {
      interfaceNum = ifc.ifc_len / sizeof(struct ifreq);
      printf("interface num = %d\n", interfaceNum);
      while (interfaceNum-- > 0)
      {
             printf("\ndevice name: %s\n", buf[interfaceNum].ifr_name);
             //ignore the interface that not up or not runing
             ifrcopy = buf[interfaceNum];
             if (ioctl(fd, SIOCGIFFLAGS, &ifrcopy))
             {
                printf("ioctl: %s [%s:%d]\n", strerror(errno), __FILE__, __LINE__);
                close(fd);
                return -1;
             }
             //get the mac of this interface
             if (!ioctl(fd, SIOCGIFHWADDR, (char *)(&buf[interfaceNum])))
             {
                memset(mac, 0, sizeof(mac));
                snprintf(mac, sizeof(mac), "%02x%02x%02x%02x%02x%02x",
                                (unsigned char)buf[interfaceNum].ifr_hwaddr.sa_data[0],
                                (unsigned char)buf[interfaceNum].ifr_hwaddr.sa_data[1],
                                (unsigned char)buf[interfaceNum].ifr_hwaddr.sa_data[2],
                                (unsigned char)buf[interfaceNum].ifr_hwaddr.sa_data[3],
                                (unsigned char)buf[interfaceNum].ifr_hwaddr.sa_data[4],
                                (unsigned char)buf[interfaceNum].ifr_hwaddr.sa_data[5]);
                printf("device mac: %s\n", mac);
             }
            else
            {
                printf("ioctl: %s [%s:%d]\n", strerror(errno), __FILE__, __LINE__);
                close(fd);
                return -1;
            }
            //get the IP of this interface
            if (!ioctl(fd, SIOCGIFADDR, (char *)&buf[interfaceNum]))
            {
                snprintf(ip, sizeof(ip), "%s",
                            (char *)inet_ntoa(((struct sockaddr_in *)&(buf[interfaceNum].ifr_addr))->sin_addr));
                printf("device ip: %s\n", ip);
            }
            else
            {
                printf("ioctl: %s [%s:%d]\n", strerror(errno), __FILE__, __LINE__);
                close(fd);
                return -1;
            }
            //get the broad address of this interface
            if (!ioctl(fd, SIOCGIFBRDADDR, &buf[interfaceNum]))
            {
                snprintf(broadAddr, sizeof(broadAddr), "%s",
                            (char *)inet_ntoa(((struct sockaddr_in *)&(buf[interfaceNum].ifr_broadaddr))->sin_addr));
                printf("device broadAddr: %s\n", broadAddr);
            }
            else
            {
                printf("ioctl: %s [%s:%d]\n", strerror(errno), __FILE__, __LINE__);
                close(fd);
                return -1;
            }
            //get the subnet mask of this interface
            if (!ioctl(fd, SIOCGIFNETMASK, &buf[interfaceNum]))
            {
                snprintf(subnetMask, sizeof(subnetMask), "%s",
                            (char *)inet_ntoa(((struct sockaddr_in *)&(buf[interfaceNum].ifr_netmask))->sin_addr));
                printf("device subnetMask: %s\n", subnetMask);
            }
            else
            {
                printf("ioctl: %s [%s:%d]\n", strerror(errno), __FILE__, __LINE__);
                close(fd);
                return -1;
            }
        }
    }
    else
    {
        printf("ioctl: %s [%s:%d]\n", strerror(errno), __FILE__, __LINE__);
        close(fd);
        return -1;
    }
   strcpy(IP,ip);
   //strcpy(broad,broadAddr);
   strcpy(Mask,subnetMask);
   close(fd);
   return 0;
}

获取网关

int readNlSock(int sockFd, char *bufPtr, int seqNum, int pId)
{
      struct nlmsghdr *nlHdr;
      int readLen = 0, msgLen = 0;
      do{
            if((readLen = recv(sockFd, bufPtr, BUFSIZE - msgLen, 0)) < 0)
            {
              perror("SOCK READ: ");
              return -1;
            }

            nlHdr = (struct nlmsghdr *)bufPtr;
            if((NLMSG_OK(nlHdr, readLen) == 0) || (nlHdr->nlmsg_type == NLMSG_ERROR))
            {
              perror("Error in recieved packet");
              return -1;
            }
            if(nlHdr->nlmsg_type == NLMSG_DONE)
            {
              break;
            }
            else
            {

              bufPtr += readLen;
              msgLen += readLen;
            }
            if((nlHdr->nlmsg_flags & NLM_F_MULTI) == 0)
            {

             break;
            }
      } while((nlHdr->nlmsg_seq != seqNum) || (nlHdr->nlmsg_pid != pId));
      return msgLen;
}

void parseRoutes(struct nlmsghdr *nlHdr, struct route_info *rtInfo,char gateway[])
{
      struct rtmsg *rtMsg;
      struct rtattr *rtAttr;
      int rtLen;
      char *tempBuf = NULL;
      struct in_addr dst;
      struct in_addr gate;
      tempBuf = (char *)malloc(100);
      rtMsg = (struct rtmsg *)NLMSG_DATA(nlHdr);
      // If the route is not for AF_INET or does not belong to main routing table
      //then return.
      if((rtMsg->rtm_family != AF_INET) || (rtMsg->rtm_table != RT_TABLE_MAIN))
      return;

      rtAttr = (struct rtattr *)RTM_RTA(rtMsg);
      rtLen = RTM_PAYLOAD(nlHdr);
      for(;RTA_OK(rtAttr,rtLen);rtAttr = RTA_NEXT(rtAttr,rtLen)){
       switch(rtAttr->rta_type) {
           case RTA_OIF:
            if_indextoname(*(int *)RTA_DATA(rtAttr), rtInfo->ifName);
            break;
           case RTA_GATEWAY:
            rtInfo->gateWay = *(u_int *)RTA_DATA(rtAttr);
            break;
           case RTA_PREFSRC:
            rtInfo->srcAddr = *(u_int *)RTA_DATA(rtAttr);
            break;
           case RTA_DST:
            rtInfo->dstAddr = *(u_int *)RTA_DATA(rtAttr);
            break;
       }
      }
      dst.s_addr = rtInfo->dstAddr;
      if (strstr((char *)inet_ntoa(dst), "0.0.0.0"))
      {
        printf("oif:%s",rtInfo->ifName);
        gate.s_addr = rtInfo->gateWay;
        sprintf(gateway, (char *)inet_ntoa(gate));
        printf("%s\n",gateway);
        gate.s_addr = rtInfo->srcAddr;
        printf("src:%s\n",(char *)inet_ntoa(gate));
        gate.s_addr = rtInfo->dstAddr;
        printf("dst:%s\n",(char *)inet_ntoa(gate));
      }
      free(tempBuf);
      return;
}

int get_gateway(char gateway[])
{
     struct nlmsghdr *nlMsg;
     struct rtmsg *rtMsg;
     struct route_info *rtInfo;
     char msgBuf[BUFSIZE];

     int sock, len, msgSeq = 0;

     if((sock = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_ROUTE)) < 0)
     {
      perror("Socket Creation: ");
      return -1;
     }
     memset(msgBuf, 0, BUFSIZE);
     nlMsg = (struct nlmsghdr *)msgBuf;
     rtMsg = (struct rtmsg *)NLMSG_DATA(nlMsg);
     nlMsg->nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg)); // Length of message.
     nlMsg->nlmsg_type = RTM_GETROUTE; // Get the routes from kernel routing table .
     nlMsg->nlmsg_flags = NLM_F_DUMP | NLM_F_REQUEST; // The message is a request for dump.
     nlMsg->nlmsg_seq = msgSeq++; // Sequence of the message packet.
     nlMsg->nlmsg_pid = getpid(); // PID of process sending the request.
     if(send(sock, nlMsg, nlMsg->nlmsg_len, 0) < 0){
      printf("Write To Socket Failed…\n");
      return -1;
     }
     if((len = readNlSock(sock, msgBuf, msgSeq, getpid())) < 0) {
      printf("Read From Socket Failed…\n");
      return -1;
     }

     rtInfo = (struct route_info *)malloc(sizeof(struct route_info));
     for(;NLMSG_OK(nlMsg,len);nlMsg = NLMSG_NEXT(nlMsg,len)){
      memset(rtInfo, 0, sizeof(struct route_info));
      parseRoutes(nlMsg, rtInfo,gateway);
     }
     free(rtInfo);
     close(sock);
     return 0;
}

转载于:https://www.cnblogs.com/QUSIR/p/6034234.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值