精华内容
下载资源
问答
  • 本文以一个完整实例形式介绍了C++实现获取IP、子网掩码、网关、DNS等本机网络参数的方法,供大家参考,具体的完整实例如下: #pragma comment(lib,Ws2_32.lib) #include #pragma comment(lib, Iphlpapi.lib) using...
  • Linux获取IP,子网掩码,网关等

    千次阅读 2019-02-20 16:38:15
    最近项目中需要获取linux系统的所有网口信息并设置默认网口,若在终端查看只需输入ifconfig命令即可,通过编程实现则比较麻烦,通过查询资料发现linux提供的ioctl()函数可以获取相关信息。下面首先介绍几个需要使用...

        最近项目中需要获取linux系统的所有网口信息并设置默认网口,若在终端查看只需输入ifconfig命令即可,通过编程实现则比较麻烦,通过查询资料发现linux提供的ioctl()函数可以获取相关信息。下面首先介绍几个需要使用到的结构体,然后提供一个实例。

         1. 结构体ifconf和ifreq

    //ifconf通常是用来保存所有接口信息的
    struct ifconf 
    {
        int    ifc_len;            /* size of buffer    */
        union 
        {
            char *ifcu_buf;                        /* input from user->kernel*/
            struct ifreq *ifcu_req;        /* return from kernel->user*/
        } ifc_ifcu;
    };
     
    //ifreq用来保存某个接口的信息
    struct ifreq {
        char ifr_name[IFNAMSIZ];
        union {
            struct sockaddr ifru_addr;
            struct sockaddr ifru_dstaddr;
            struct sockaddr ifru_broadaddr;
            short ifru_flags;
            int ifru_metric;
            caddr_t ifru_data;
        } ifr_ifru;
    };
    

        2. 结构体sockaddr和sockaddr_in

    struct sockaddr {
        unsigned short    sa_family;    // 2 bytes address family, AF_xxx
        char              sa_data[14];     // 14 bytes of protocol address
    };
     
    struct sockaddr_in {
        short            sin_family;       // 2 bytes e.g. AF_INET, AF_INET6
        unsigned short   sin_port;    // 2 bytes e.g. htons(3490)
        struct in_addr   sin_addr;     // 4 bytes see struct in_addr, below
        char             sin_zero[8];     // 8 bytes zero this if you want to
    }; 
    struct in_addr {
        unsigned long s_addr;          // 4 bytes load with inet_pton()
    };

        二者长度一样,都是16个字节,即占用的内存大小是一致的,因此可以互相转化。二者是并列结构,指向sockaddr_in结构的指针也可以指向sockaddr。

        3. 实例

      #include <stdio.h>
      #include <string.h>
      #include <net/if.h>
      #include <sys/ioctl.h>
      #include <arpa/inet.h>
      #include <errno.h>
       
      int getInterfaceInfo(void)
      {
          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 = %dn", interfaceNum);
              while (interfaceNum-- > 0) //逐个提取
              {
                  printf("ndevice name: %sn", 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: %sn", 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: %sn", 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: %sn", 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: %sn", 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;
         }
       
         close(fd);
         return 0;
    }
    
    int main(void)
    {
         getInterfaceInfo();
         return 0;
    }

     

     

     

     

     

    参考:

    https://blog.csdn.net/CYKsky/article/details/77986645

    https://www.cnblogs.com/fnlingnzb-learner/p/6427388.html

    展开全文
  • C语言编写 网络编程获取子网掩码 需安装库函数
  • 百度大法搜的获取网络配置(包括子网掩码)的方法基本都是拿wifimanager的dhcpinfo获取网络信息,这个方法获取到的其他信息都没问题,唯独子网掩码获取到的要么就是错的,要么就是0.0.0.0 参考 ...

    百度大法搜的获取网络配置(包括子网掩码)的方法基本都是拿wifimanager的dhcpinfo获取网络信息。

    这个方法获取到的其他信息都没问题,唯独子网掩码获取到的要么就是错的,要么就是0.0.0.0

    有问题的获取方式如下:

        public static String getNetMask(Context context){
            DhcpInfo dhcpInfo = ((WifiManager) context
                    .getSystemService(Context.WIFI_SERVICE)).getDhcpInfo();
            return formatIpAddress(dhcpInfo.netmask);
        }
        private static String formatIpAddress(int ipAdress) {
    
            return (ipAdress & 0xFF ) + "." +
                    ((ipAdress >> 8 ) & 0xFF) + "." +
                    ((ipAdress >> 16 ) & 0xFF) + "." +
                    ( ipAdress >> 24 & 0xFF) ;
        }

    我使用此方式获取的子网掩码大多数是0.0.0.0,偶尔是255.0.0.0,但真实的子网掩码是255.255.252.0

    参考终于取到了Android的子网掩码 - 简书 (jianshu.com)的方法

    使用ifconfig并解析的方式获取子网掩码,但是参考链接里没有做出网卡区分,在此对这个方法做一定的修改

    针对的默认ifconfig的打印如下:

    wlan0     Link encap:Ethernet  HWaddr 44:01:bb:4e:0d:8a  Driver rtl8723du
              UP BROADCAST MULTICAST  MTU:1500  Metric:1
              RX packets:19568 errors:0 dropped:36 overruns:0 frame:0 
              TX packets:6412 errors:0 dropped:0 overruns:0 carrier:0 
              collisions:0 txqueuelen:1000 
              RX bytes:2554230 TX bytes:3465241 
    
    p2p0      Link encap:Ethernet  HWaddr 46:01:bb:4e:0d:8a  Driver rtl8723du
              UP BROADCAST MULTICAST  MTU:1500  Metric:1
              RX packets:0 errors:0 dropped:0 overruns:0 frame:0 
              TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 
              collisions:0 txqueuelen:1000 
              RX bytes:0 TX bytes:0 
    
    eth0      Link encap:Ethernet  HWaddr bc:26:1d:04:4a:f9
              inet addr:192.168.50.6  Bcast:192.168.50.255  Mask:255.255.255.0 
              inet6 addr: fe80::6de2:eac1:c614:5ccb/64 Scope: Link
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:224 errors:0 dropped:0 overruns:0 frame:0 
              TX packets:6665 errors:0 dropped:0 overruns:0 carrier:0 
              collisions:0 txqueuelen:1000 
              RX bytes:29352 TX bytes:2200704 
              Interrupt:41 Base address:0x4000 
    
    lo        Link encap:Local Loopback  
              inet addr:127.0.0.1  Mask:255.0.0.0 
              inet6 addr: ::1/128 Scope: Host
              UP LOOPBACK RUNNING  MTU:65536  Metric:1
              RX packets:255 errors:0 dropped:0 overruns:0 frame:0 
              TX packets:255 errors:0 dropped:0 overruns:0 carrier:0 
              collisions:0 txqueuelen:1 
              RX bytes:18156 TX bytes:18156

    分别作了获取默认的wlan0的子网掩码和获取eth0的子网掩码,代码如下:

    private static final String defaultIP = "0.0.0.0";
            private static final String command = "ifconfig";
            public static String getWlan0Mask() {
                String TAG = "lanky";
                String Mask = defaultIP;
                try {
                    Process process = Runtime.getRuntime().exec(new String[]{command});
                    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
                    do {
                        String line = bufferedReader.readLine();
                        if (line == null) {
                            Log.d(TAG, "test: line is null");
                            break;
                        }
                        if (line.startsWith("wlan0     ")) {
                            Mask = defaultIP;
                        }
                        Mask = getLineMask(line).equals("") ?Mask:getLineMask(line);
                        if (line.startsWith("p2p0      ")) {
                            break;
                        }
    
    
                    } while (true);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return Mask;
            }
            public static String getEth0Mask() {
                String TAG = "lanky";
                String Mask = defaultIP;
                try {
                    Process process = Runtime.getRuntime().exec(new String[]{command});
                    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
                    do {
                        String line = bufferedReader.readLine();
                        if (line == null) {
                            Log.d(TAG, "test: line is null");
                            break;
                        }
                        if (line.startsWith("eth0      ")) {
                            Mask = defaultIP;
                        }
                        Mask = getLineMask(line).equals("") ?Mask:getLineMask(line);
                        if (line.startsWith("lo        ")) {
                            break;
                        }
                    } while (true);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return Mask;
            }
    
            private static String getLineMask(String line){
                String TAG = "mask";
                String IP = "";
                if (line.trim().matches("inet addr:(\\d{1,3}\\.){3}\\d{1,3}( ){2}" +
                        "(Bcast:(\\d{1,3}\\.){3}\\d{1,3}( ){2}){0,1}" +
                        "Mask:(\\d{1,3}\\.){3}\\d{1,3}")) {
                    String[] props = line.trim().split("( ){2}");
                    for (String prop : props) {
                        if (prop.length() == 0) {
                            continue;
                        }
    
                        String[] kv = prop.split(":");
                        if (kv[0].startsWith("inet addr")) {
                            Log.d(TAG, "----ipAddr: " + kv[1]);
                        } else if (kv[0].startsWith("Bcast")) {
                            Log.d(TAG, "----Bcast: " + kv[1]);
                        } else if (kv[0].startsWith("Mask")) {
                            Log.d(TAG, "----mask: " + kv[1]);
                            IP = kv[1];
                        }
                    }
                }
                return IP;
            }

    如果有多个网卡,要想获取别的,可以参考我这个代码,根据你自己的ifconfig的打印来修改就好了

    注:需要uid.system和系统签名及权限,适合系统级应用的开发参考,比如setting、Launcher等

    展开全文
  • 主要介绍了Python实现根据IP地址和子网掩码算出网段的方法,涉及Python基于Linux平台的字符串操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下
  • #include <arpa/inet.h> #include <sys/socket.h> #include <netdb.h> #include <ifaddrs.h> #include <stdio.h> #include <stdlib.h> #include <...int main(i...
    #include <arpa/inet.h>
    #include <sys/socket.h>
    #include <netdb.h>
    #include <ifaddrs.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    
    int main(int argc, char *argv[])
    {
    	struct ifaddrs *ifaddr, *ifa;
    	int family, s;
    	char host[NI_MAXHOST];
    	struct sockaddr_in *addr;
    	
    	if (getifaddrs(&ifaddr) == -1) {
    		perror("getifaddrs");
    		exit(EXIT_FAILURE);
    	}
    	
    	for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
    		if (ifa->ifa_addr == NULL)
    			continue;
    		
    		family = ifa->ifa_addr->sa_family;
    		
    		if (family == AF_INET)
    		{
    			printf("Device name: %s\n", ifa->ifa_name);
    			addr = (struct sockaddr_in *)ifa->ifa_addr;
    			printf("	Addr: %s\n",
    				inet_ntop(AF_INET, &(addr->sin_addr), host, sizeof(host)));
    			
    			addr = (struct sockaddr_in *)ifa->ifa_broadaddr;
    			printf("	Bcast address: %s\n",
    				inet_ntop(AF_INET, &(addr->sin_addr), host, sizeof(host)));
    			
    			addr = (struct sockaddr_in *)ifa->ifa_netmask;
    			printf("	Mask address: %s\n",
    				inet_ntop(AF_INET, &addr->sin_addr, host, sizeof(host)));
    		}
    	}
    }

     

    展开全文
  • java获取Centos7服务器网卡ip 子网掩码 默认网关 DNS 同时设置网卡 及 重启网卡参考
  • # This is a script to gather network information of your Linux system. # Test under Ubuntu 10.04 only. #---------------------------- NIC=eth0 MAC=`LANG=C ifconfig $NIC | awk '/HWaddr/{ print $5 }' ` ...
  • 文章目录文件操作解释什么是子网掩码什么是网关 文件操作 修改文件 vi ect/sysconfig/network-scripts/ifcfg-eth0 ifcfg-eth0文件名;有可能名字不一样 DEVICE=eth0 设备名称 HWADDR=00:0c:29:d3:bb:e5 ...

    文件操作

    1. 修改文件
    vi ect/sysconfig/network-scripts/ifcfg-eth0
    

    ifcfg-eth0文件名;有可能名字不一样

    DEVICE=eth0  							设备名称
    HWADDR=00:0c:29:d3:bb:e5 				mac地址
    TYPE=Ethernet 							网络类型
    ONBOOT=yes								开机自启动
    NM_CONTROLLED=yes
    BOOTPROTO=static 						BOOTPROTO接受3个参数:none(禁止dhcp),static(静态IP),dhcp(自动获取)
    DNS1=192.168.1.1						snd
    IPV6INIT=no
    USERCTL=no
    IPADDR=192.168.1.155					ip地址
    NETMASK=255.255.255						子网掩码
    GATEWAY=192.168.1.1						网关
    

    2.编辑完成后,保存退出
    重启网络服务

    service network restart
    

    然后ping网关,ping外网进行测试。都能ping通表示网络正常

    解释

    什么是子网掩码

    子网掩码不能单独存在,它必须结合IP地址一起使用。子网掩码只有一个作用,就是将某个IP地址划分成网络地址和主机地址两部分。

    什么是网关

    默认网关的意思是一台主机如果找不到可用的网关,就把数据包发给默认指定的网关,由这个网关来处理数据包。现在主机使用的网关,一般指的是默认网关。

    展开全文
  • android获取wifi的IP,子网掩码,网关,dns等信息
  • #include <netinet/in.h> #include <netinet/tcp.h> /* TCP_NODELAY */ #include <unistd.h> /* for convenience */ #include <limits.h> #include <time.h>...#include &
  • Linux下编写获取本机网卡地址的程序,比较简单的方法是利用套接口(socket)和IO接口(ioctl)函数来获取网卡信息,需要引用如下文件: #include #include #include #include #include <linux/sockios.h>...
  • //子网掩码 inet_ntop(AF_INET, &(((struct sockaddr_in*)((*IfAddrStruct).ifa_broadaddr))->sin_addr), board, 64);//广播地址 cout ip: " } else if(IfAddrStruct->ifa_addr->sa_family == AF_INET6)//IPV6 { ...
  • 获取本地的ip时 顺便学习了下标准库net中的实现 在net/interface.go中进行了入口调用,返回值为Addr的slice func InterfaceAddrs() ([]Addr, error) { ifat, err := interfaceAddrTable(nil) if err != nil { ...
  • 子网掩码格式为255.255.255.0可以通过以下脚本计算掩码位数 #!/bin/sh #maskdigits.sh mask maskdigits () { a=$(echo "$1" | awk -F "." '{print $1" "$2" "$3" "$4}') for num in $a; do while [ $num != 0 ];do ...
  • 下面是获取Linux子网掩码,Windows的获取方式有变化,需要通过cmd.exe ipconfig运行后截取内容,这里暂时只有Linux获取方式。 [code="java"] String getLocalMask(){ String cmd="ifconfig&...
  • 1、子网掩码地址转换为网络位长度 // 如 255.255.255.0 对应的网络位长度为 24 func SubNetMaskToLen(netmask string) (int, error) { ipSplitArr := strings.Split(netmask, ".") if len(ipSplitArr) != 4 { ...
  • 嵌入式linux获取网络IP和子网掩码

    千次阅读 2014-03-28 10:38:29
    int GetIPAddrAndNetMask(char *ps8Ipaddr, char *ps8NetMask, const char *ps8IfName) {  int sock;  struct sockaddr_in *sin;  struct ifreq *ifr;  char as8Buff[BUFSIZ];... if (
  • 使用root用户登录进入Linux,打开进去终端 ...开始编辑,填写ip地址、子网掩码、网关、DNS等。其中“红框内的信息”是必须得有的。 编辑完成后,保存退出 重启网络服务 service network restart或/etc...
  • cff:fe9c:a4b3 NAT network address 转换 好处: a :节约大量的公网ip地址 b :减少了网络攻击 二、子网掩码 子网掩码的作用 决定一个网段的大小(可用IP的数量) 子网掩码实例 如:192.168.11.0/24 二进制 十进制...
  • ioctl函数原型: int ioctl(int fd, int request, ..../*void *arg*/) int fd:为socket函数返回值 int request:SIOCSIFADDR 修改ip地址  SIOCSIFNETMASK 修改子网掩码  SIOCADDRT 修改网关 ...ip和子网掩码结构
  • Linux获取本地IP地址、子网掩码、广播地址: 最近有个项目需求需要得到自己的广播地址从而发给在同一广播域的其他设备,在网上查找了一些资料,可以调用驱动接口获取。我设备有三个ip接口:eth0、eth1、和回环...
  • 作为网络基础,主机IP和网关应该在同一个子网内,基于此,可以作为简单判断IP地址、子网掩码和网关的基本原理,即IP地址与子网掩码进行位与的结果应该和网关与子网掩码位与结果相同。 5:IP地址字符串转整数 ...
  • 无线网络信息可以通过api直接获取,无需特别处理,下面主要是机顶盒等android设备使用有线网络时网络信息的获取。 1.网络类型 /** * 获取网络类型 * @return * -1:未知网络 * 0:无网络 * 1:wifi...
  • 大致的逻辑就是通过命令行ip addr 来获取到这些,然后再截取出来 讲解: ip route list | grep via | awk '{print $1}' grep 通过关键字截取 awk 一个单词一个单词的获取 '{print $1}' $1是获取第一个 实际...
  • 这是我在VMware的Ubuntu虚拟机上建立tftp连接时遇到的问题,问题描述如下 当时在网上也是各种搜索,但是搜到的答案属于同一类,让你用DHCP服务,但是有一个问题,无论能不能成功, 最后都不是我想要的结果,我...
  • 一:Linux自动获得IP的情况下查询ip及子网掩码 打开命令终端输入ifconfig -a 从上图可以看出:IP:10.113.1.130,Mask:255.255.255.0   二:查看网关 在命令终端输入:route default那一行10.113.0.254就是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 19,668
精华内容 7,867
关键字:

linux获取子网掩码

linux 订阅