java 通过doc命令获取IP 路由器网关正在获取等 无法获取出来???下面是代码

java 通过doc命令获取IP 网关等 无法获取出来???下面是代码_百度知道
java 通过doc命令获取IP 网关等 无法获取出来???下面是代码
while ((line =;;c ipconfig /
index += 2;
打印出来为空;all&quot.startsWith(&quot!= null && os.substring(index););
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
ipaddress =
System:&quot!= null) {
if (获得机器IP地址
public static String getIPAddress() {
String ipaddress = &&#47.indexOf(&br.exec(command);+br,有谁知道吗.getRuntime();
// 0) {
int index =&quot.readLine()) ?;IP Address&quot?
Process p = R).close();
}这段代码哪里有问题?请指点;) &gt.readLine())&#47.out.getProperty(&quot.indexOf(&quot.name&quot?!;
} catch (IOException e) {
return ipaddress!;)) {
String command = &Windows&quot.exe &#47.trim().println(&quot:
String os = System
提问者采纳
System.name&
//&nbsp?i)\\s*&quot.
GBK&=&(;osw&R
if&nbsp.flush&nbsp.().hiphotos://h;new&=&nbsp.OutputStreamWriter.close&String[]&getIPConfigAll&=&);());address&quot.BufferedReader.jpg" target="_blank" title="点击查看大图" class="ikqb_img_alink"><img class="ikqb_img" src=" } public&[^\\.trim&nbsp.io.println&=&nbsp.readLine&nbsp./zhidao/pic/item/e251f9cc;
);(&public&nbsp.getErrorStream&key&sis&OutputStreamWriter&nbsp.getRuntime&nbsp.baidu.printStackTrace&(&br.hiphotos,&Autoconfiguration&nbsp.();import&
return&nbsp://h.close&(null&(&YuGiOh{ public&(osw);(&
isr& }}<a href="));;());(;))
if&();new&import&import&():([^\\;
SequenceInputStream&Name&(&quot.getOutputStream&))
Process&nbsp.InputStreamR/zhidao/wh%3D600%2C800/sign=04c6d4cff336afc30ec7fc/e251f9cc;String&();(&((getIPConfigAll&cmd&quot.&nbsp.Host&class&Address&new&=&
IP&InputStreamReader&(&(isr);
catch&();&(getIPConfigAll&nbsp.*&&(
InputStreamReader&(&quot.println&(&=&()&static&
while&nbsp.;command
OutputStreamWriter&();S
System.replaceAll&nbsp.matches&process&
));void&nbsp.jpg" esrc=").BufferedWline&().getProperty&(getIPConfigAll&nbsp.write&nbsp.println&nbsp.getInputStream&=&(&quot.
BufferedWriter&nbsp.hiphotos?i);(args&main&nbsp.SequenceInputSstatic&nbsp.newLine&e)
e;+&nbsp:]*)&quot。import&
//&(Exception&line.matches&nbsp.close&nbsp.exec&(&();new&
BufferedReader&bw&$1&quot://h;key) {
String&:]+\\;BufferedWriter&((String&nbsp.next&&quot.*&+&(=&os&BufferedReader&line&br&nbsp!=&) {
System.close&);java.*window回答完毕;)).com/zhidao/wh%3D450%2C600/sign=0ddc1f26efc4bfacca304e251f9cc,采纳即可;/all&(),&SequenceInputStream&read
String&ip&);=&new&))
return&nbsp.import&nbsp,&nbsp
我的出来还是为空,没有任何值啊??
不知道了哦,我的有图有真相,不知道你的是为什么哦
你看看& 我就复制的你的& 读出来还是空????
你直接到cmd里面敲,恐怕是显示不同,对于操作系统不同,我的是xp,估计是正则那里的小问题
你的代码是对的
我的是中文的
你的是英文的
写成System.out.println (getIPConfigAll (&IPv4 地址&));
这样就对了但是问题又来了
我的电脑上有虚拟机
就有好几个ip
我怎么才能找到是我本地用的ip呢??
找到对应的key就可以了啊,这个方法就是根据冒号:前面的key找到冒号后面的value
提问者评价
其他类似问题
1if (line.60:
192:b636. :91d5%11
192. . . . . . . .168. . .255:b636.60:. .60. ; 0) { 这一行改为if (line:c484::f856;IPv4 Address&quot. . . . . . . . . : 255,在我的机器上. . . . . . : fe80. ,一般情况下默认的都是中文的输出类似下面这样. . .1直接匹配英文的字符串肯定就匹配不到了: fe80. . : 192. : 192. :
本地链接 IPv6 地址. :7086. . . . . . . . . .indexOf(&quot. :
Link-local IPv6 Address . . . . . .255,因为执行这个命令第一行本来就是空.indexOf(&quot.168. . : 255,可以在ipconfig之前 执行一个chcp 437 将代码页设置为英文. . .0
默认网关. . . . . . . . :
连接特定的 DNS 后缀 . :
Connection-specific DNS Suffix
. . :75eb. .117
Subnet Mask .168. . . .60:.168. ;) &gt. :19e2%11
IPv4 Address. :7086: fe80.255:. . . . . . . .0
Default Gateway . ,执行结果是下面这样的:80e7:c484:
IPv4 地址 :f856. . :75eb. :80e7; 0) 就可以用了. . . ,因为执行dos命令打印出来的结果 是受到dos窗口代码页设置的影响的,取不出来主要是判断条件不对代码注释中打印出来为空的地方不是问题.255. . ,不同版本的windows具体字符可能不同. ;IP Address&quot.117
子网掩码) &gt: fe80
怎么将代码页换成英文的啊??
String cmd = &cmd &#47;c echo chcp 437&run.bat&;
Process p = Runtime.getRuntime().exec(cmd);
p = Runtime.getRuntime().exec(
&cmd &#47;c echo ipconfig -all&&run.bat&);
p = Runtime.getRuntime().exec(&cmd &#47;c run.bat&);
BufferedReader br = new BufferedReader(new InputStreamReader(
p.getInputStream()));这样试试,用了一个临时文件
网关的相关知识
按默认排序
其他2条回答
因为第一行本来就是空的,你把
System??;&#47?:”+br.readLine()):
1;br.out.&#47:&+br,所以你看不到数据; &#47.readLine()+“2?改成
System.readLine()).println(&
打印出来为空; &#47.println(&quot:
打印出来为空;br代码没问题的
cmd的返回值是什么类型的?存放在哪里?你去取了么?cmd是output结果,你要找到它的存放地址才能读
这个怎么弄啊
我这个也是在网上看别人的
试了好多都读不出来
可能就是cmd的原因吧!
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁Java网络编程从入门到精通(7):获取IP地址
┆┆ &┆ &┆ ┆
站内资源搜索:
┆ 将本文寄给朋友&&
Java网络编程从入门到精通(7):获取IP地址
〖 作者:androidguy 〗〖 大小:3k 〗〖 发布日期: 〗〖 浏览:0 〗
&这个方法用来得到主机的IP地址,这个IP地址可能是IPv4的地址,也可能是IPv6的地址。getHostAddress方法的定义如下:
public&String&getHostAddress()
无论InetAddress对象是使用哪种方式创建的,getHostAddress方法都不会访问DNS服务器。如果想访问使用IPv6地址的远程主机,需要在操作系统上安装IPv6协议。下面是Windows 2003上安装IPv6协议的步骤:
第一步:打开“本地连接”属性对话框。如图1所示。
“本地连接”属性对话框
第二步:点击“安装”按钮,出现“选择网络组件类型”对话框,选择“协议”选项后,点击“添加”按钮,出现如图2的“选择网络协议”对话框,选择“Microsoft TCP/IP 版本6”,最后点击“确定”按钮。
“选择网络协议”对话框
除了使用图形化界面来安装IPv6外,还可以使用如下命令行来安装IPv6:
&&&&&&&netsh&interface&ipv6&install
下面的代码演示了如何利用getHostAddress得到IPv4和IPv6地址,以及如何得到本机的所有IP地址(包括IPv4和IPv6地址)。
&&&&&&&package
import&java.net.*;
public&class MyIP
&&&&public&static&void&main(String[]&args)&throws&Exception
&&&&&&&&//&输出IPv4地址
&&&&&&&&InetAddress&ipv4Address1&=&InetAddress.getByName("<SPAN
style="COLOR: #.2.3.4");
&&&&&&&&System.out.println("ipv4Address1:&"&+&ipv4Address1.getHostAddress());
&&&&&&&&InetAddress&ipv4Address2&=&InetAddress.getByName("");
&&&&&&&&System.out.println("ipv4Address2:&"&+&ipv4Address2.getHostAddress());
&&&&&&&&InetAddress&ipv4Address3&=&InetAddress.getByName("myuniverse");
&&&&&&&&System.out.println("ipv4Address3:&"&+&ipv4Address3.getHostAddress());
&&&&&&&&//&输出IPv6地址
&&&&&&&&InetAddress&ipv6Address1&=&InetAddress.getByName("abcd:123::22ff");
&&&&&&&&System.out.println("ipv6Address1:&"&+&ipv6Address1.getHostAddress());
&&&&&&&&InetAddress&ipv6Address2&=&InetAddress.getByName("www.");
&&&&&&&&System.out.println("ipv6Address2:&"&+&ipv6Address2.getHostAddress());
&&&&&&&&//&输出本机全部的IP地址
&&&&&&&&InetAddress&Addresses[]&=&InetAddress.getAllByName("myuniverse");
&&&&&&&&for&(InetAddress&address&:&Addresses)
&&&&&&&&&&&&System.out.println("本机地址:"&+&address.getHostAddress());
在上面代码中使用了www.作为域名,这个域名是东北大学用于测试IPv6地址的域名。下面是其他一些可用于测试IPv6的域名,读者可以使用ping命令或例程3-9来测试这些域名。
&&&&&&www6.&(武汉大学)
www.(吉林大学)
www6.(上海理工大学)
www.(复旦大学)
在访问这些域名之前,本机必须使用上述的方法或命令行安装IPv6,否则getByName方法将抛出UnknownHostException异常。
&&&&&&& 运行结果:
&&&&&&&ipv4Address1:&<SPAN
style="COLOR: #.2.3.4
ipv4Address2:&<SPAN
style="COLOR: #9.42.60.212
ipv4Address3:&<SPAN
style="COLOR: #2.168.18.10
ipv6Address1:&abcd:<SPAN
style="COLOR: #3:<SPAN style="COLOR: #:<SPAN style="COLOR: #:<SPAN style="COLOR: #:<SPAN style="COLOR: #:<SPAN style="COLOR: #:22ff
ipv6Address2:&<SPAN
style="COLOR: #01:da8:<SPAN
style="COLOR: #00:b255:<SPAN
style="COLOR: #0:e8ff:feb0:5c5e
本机地址:<SPAN
style="COLOR: #2.168.18.10
本机地址:<SPAN
style="COLOR: #2.168.83.1
本机地址:<SPAN
style="COLOR: #2.168.189.1
本机地址:<SPAN
style="COLOR: #3.10.10.10
本机地址:<SPAN
style="COLOR: #:<SPAN
style="COLOR: #:<SPAN
style="COLOR: #:<SPAN
style="COLOR: #:<SPAN
style="COLOR: #:<SPAN
style="COLOR: #:<SPAN
style="COLOR: #:<SPAN
style="COLOR: #
在上面的运行结果中的IP地址192.168.18.10和192.10.10.10是和本机网卡绑定的两个IP,而192.168.83.1和192.168.189.1是VMware虚拟机软件在本机安装的两个虚拟网卡的地址。最后一个IPv6地址0:0:0:0:0:0:0:1是代表本机的IPv6网址,相当于IPv4地址的127.0.0.1。读者可以使用如下命令行添加IPv6地址和删除IPv6:
添加IPv6地址
&&&&&&&&netsh&interface&ipv6&add&address&"本地连接"&aa:bb::cc
&&&&&&&netsh&interface&ipv6&uninstall
注意:安装IPv6不需要重新启动计算机,但添加IPv6地址或删除IPv6后,必须重新启动计算机才能生效。
本文出自 “”
博客,请务必保留此出处
http://androidguy./761
&严禁发表涉及封建迷信、国家政治等敏感问题的内容
&■ 对本文的评价(带 * 为必填内容,400字以内)&&&&严禁发表涉及封建迷信、国家政治等敏感问题的内容。
您的电子邮件&
您的个人主页&
* 您的评价&
以往的评价
以上文章版权由原作者所有。未经同意,不得将其任何一部分复制、转载、发布等未授权操作。
Java学习室 ― 陈伟波个人主页
COPY RIGHT 2005养生图片信息
乐园图片信息
扮靓图片信息
爱好图片信息
网购图片信息
24小时更新第四页第三页第二页第一页
备案号:粤ICP备号
QQ在线服务: 邮箱:
地址:深圳市南山区西丽镇桃源街道办事处长源社区5栋602
CopyRight , www.babsoft.net, Inc.All Rights Reserved.获取IP地址,网关的DOS命令都是什么呀??_百度知道
获取IP地址,网关的DOS命令都是什么呀??
能给小弟列出一个比较全的网络的DOS命令吗?有加分奖励哦.
各位大哥,我的意思是重新获取IP,网关地址的命令!
dos命令的相关知识
按默认排序
其他3条回答
运行 cmd 回车ipconfig/all
ping 机器名
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁25248人阅读
博客分类:&
&&& ifaddrs结构体定义如下:
struct&ifaddrs&&&
&&&&struct&ifaddrs&&*ifa_&&&&&&&
&&&&char&&&&&&&&&&&&*ifa_&&&&&&&
&&&&unsigned&int&&&&&ifa_&&&&&&
&&&&struct&sockaddr&*ifa_&&&&&&&
&&&&struct&sockaddr&*ifa_&&&&
&&&&union&&&
&&&&&&&&struct&sockaddr&*ifu_&&&&
&&&&&&&&struct&sockaddr&*ifu_&&&&
&&&&}&ifa_&&&
&&&&#define&&&&&&&&&&&&&&ifa_broadaddr&ifa_ifu.ifu_broadaddr&&&
&&&&#define&&&&&&&&&&&&&&ifa_dstaddr&&&ifa_ifu.ifu_dstaddr&&&
&&&&void&&&&&&&&&&&&*ifa_&&&&&&&
&&&&ifa_next指向链表的下一个成员;ifa_name是接口名称,以0结尾的字符串,比如eth0,lo;ifa_flags是接口的标识位(比如当IFF_BROADCAST或IFF_POINTOPOINT设置到此标识位时,影响联合体变量ifu_broadaddr存储广播地址或ifu_dstaddr记录点对点地址);ifa_netmask存储该接口的子网掩码;结构体变量存储广播地址或点对点地址(见括弧介绍ifa_flags);ifa_data存储了该接口协议族的特殊信息,它通常是NULL(一般不关注他)。
&&& 函数getifaddrs(int getifaddrs (struct ifaddrs **__ifap))获取本地网络接口信息,将之存储于链表中,链表头结点指针存储于__ifap中带回,函数执行成功返回0,失败返回-1,且为errno赋&#20540;。
&&& 很显然,函数getifaddrs用于获取本机接口信息,比如最典型的获取本机IP地址。
分类:&&&861人阅读&&&
这 是一项不太清晰而且没有多大意义的工作。一个原因是网络地址的设置非常灵活而且都是允许用户进行个性化设置的,比如一台计算机上可以有多块物理网卡或者虚 拟网卡,一个网卡上可以绑定多个IP地址,用户可以为网卡设置别名,可以重命名网卡,用户计算机所在网络拓扑结构未知,主机名设置是一个可选项并且同样可 以为一个计算机绑定多个主机名等,这些信息都会有影响。脱离了网络连接,单独的网络地址没有任何意义。编程中遇到必须获取计算机IP的场景,应该考虑将这 一选项放到配置文件中,由用户自己来选择。
通过google,编程获取IP地址大约有以下三种思路:
1. 通过gethostname()和gethostbyname()
#include &stdio.h&
#include &unistd.h&
#include &netdb.h&
#include &sys/socket.h&
#include &netinet/in.h&
#include &arpa/inet.h&
int main() {
&&& char hname[128];
&&& struct hostent *
&&& gethostname(hname, sizeof(hname));
&&& //hent = gethostent();
&&& hent = gethostbyname(hname);
&&& printf(&hostname: %s/naddress list: &, hent-&h_name);
&&& for(i = 0; hent-&h_addr_list[i]; i&#43;&#43;) {
&&&&&&& printf(&%s/t&, inet_ntoa(*(struct in_addr*)(hent-&h_addr_list[i])));
&&& return 0;
[whb@jcwkyl c]$ ./local_ip&
hostname: jcwkyl.
address list: 10.60.56.90&&&&&&&
2. 通过枚举网卡,API接口可查看man 7 netdevice
/*代码来自StackOverflow: /questions/212528/linux-c-get-the-ip-address-of-local-computer */
#include &stdio.h&&&&&&&
#include &sys/types.h&
#include &ifaddrs.h&
#include &netinet/in.h&&
#include &string.h&&
#include &arpa/inet.h&
int main (int argc, const char * argv[]) {
&&& struct ifaddrs * ifAddrStruct=NULL;
&&& void * tmpAddrPtr=NULL;
&&& getifaddrs(&ifAddrStruct);
&&& while (ifAddrStruct!=NULL) {
&&&&&&& if (ifAddrStruct-&ifa_addr-&sa_family==AF_INET) { // check it is IP4
&&&&&&&&&&& // is a valid IP4 Address
&&&&&&&&&&& tmpAddrPtr=&((struct sockaddr_in *)ifAddrStruct-&ifa_addr)-&sin_
&&&&&&&&&&& char addressBuffer[INET_ADDRSTRLEN];
&&&&&&&&&&& inet_ntop(AF_INET, tmpAddrPtr, addressBuffer, INET_ADDRSTRLEN);
&&&&&&&&&&& printf(&%s IP Address %s/n&, ifAddrStruct-&ifa_name, addressBuffer);&
&&&&&&& } else if (ifAddrStruct-&ifa_addr-&sa_family==AF_INET6) { // check it is IP6
&&&&&&&&&&& // is a valid IP6 Address
&&&&&&&&&&& tmpAddrPtr=&((struct sockaddr_in *)ifAddrStruct-&ifa_addr)-&sin_
&&&&&&&&&&& char addressBuffer[INET6_ADDRSTRLEN];
&&&&&&&&&&& inet_ntop(AF_INET6, tmpAddrPtr, addressBuffer, INET6_ADDRSTRLEN);
&&&&&&&&&&& printf(&%s IP Address %s/n&, ifAddrStruct-&ifa_name, addressBuffer);&
&&&&&&& }&
&&&&&&& ifAddrStruct=ifAddrStruct-&ifa_
&&& return 0;
[whb@jcwkyl c]$ ./local_ip2&
lo IP Address 127.0.0.1
eth0 IP Address 10.60.56.90
eth0:1 IP Address 192.168.1.3
lo IP Address ::
eth0 IP Address ::2001:da8:b000:fff
eth0 IP Address 0:0:fe80::20f:1fff
3. 打开一个对外界服务器的网络连接,通过getsockname()反查自己的IP
分类:&&&306人阅读&&&
在linux下 获取,修改本机IP地址的两个函数
//获取本机IP地址函数
//修改本机IP地址的函数
int&SetLocalIp(&const&char&*ipaddr&)&&
&&&&int&sock_set_&&
&&&&struct&sockaddr_in&sin_set_&&
&&&&struct&ifreq&ifr_set_&&
&&&&bzero(&&ifr_set_ip,sizeof(ifr_set_ip));&&
&&&&if(&ipaddr&==&NULL&)&&
&&&&&&&&return&-1;&&
&&&&if(sock_set_ip&=&socket(&AF_INET,&SOCK_STREAM,&0&)&==&-1);&&
&&&&&&&&perror(&socket&create&failse...SetLocalIp!/n&);&&
&&&&&&&&return&-1;&&
&&&&memset(&&sin_set_ip,&0,&sizeof(sin_set_ip));&&
&&&&strncpy(ifr_set_ip.ifr_name,&&eth0&,&sizeof(ifr_set_ip.ifr_name)-1);&&&&&
&&&&sin_set_ip.sin_family&=&AF_INET;&&
&&&&sin_set_ip.sin_addr.s_addr&=&inet_addr(ipaddr);&&
&&&&memcpy(&&ifr_set_ip.ifr_addr,&&sin_set_ip,&sizeof(sin_set_ip));&&
&&&&if(&ioctl(&sock_set_ip,&SIOCSIFADDR,&&ifr_set_ip)&&&0&)&&
&&&&&&&&perror(&&Not&setup&interface/n&);&&
&&&&&&&&return&-1;&&
&&&&ifr_set_ip.ifr_flags&|=&IFF_UP&|IFF_RUNNING;&&
&&&&if(&ioctl(&sock_set_ip,&SIOCSIFFLAGS,&&ifr_set_ip&)&&&0&)&&
&&&&&&&&&perror(&SIOCSIFFLAGS&);&&
&&&&&&&&&return&-1;&&
&&&&close(&sock_set_ip&);&&
&&&&return&0;&&
在linux下 获取本机MAC地址的函数
获取本机MAC地址函数
QString&GetLocalMac()&&
&&&&int&sock_&&
&&&&struct&ifreq&ifr_&&
&&&&char&mac_addr[30];&&&&&
&&&&sock_mac&=&socket(&AF_INET,&SOCK_STREAM,&0&);&&
&&&&if(&sock_mac&==&-1)&&
&&&&&&&&perror(&create&socket&falise...mac/n&);&&
&&&&&&&&return&&&;&&
&&&&memset(&ifr_mac,0,sizeof(ifr_mac));&&&&&
&&&&strncpy(ifr_mac.ifr_name,&&eth0&,&sizeof(ifr_mac.ifr_name)-1);&&&&&
&&&&if(&(ioctl(&sock_mac,&SIOCGIFHWADDR,&&ifr_mac))&&&0)&&
&&&&&&&&printf(&mac&ioctl&error/n&);&&
&&&&&&&&return&&&;&&
&&&&sprintf(mac_addr,&%02x%02x%02x%02x%02x%02x&,&&
&&&&&&&&&&&&(unsigned&char)ifr_mac.ifr_hwaddr.sa_data[0],&&
&&&&&&&&&&&&(unsigned&char)ifr_mac.ifr_hwaddr.sa_data[1],&&
&&&&&&&&&&&&(unsigned&char)ifr_mac.ifr_hwaddr.sa_data[2],&&
&&&&&&&&&&&&(unsigned&char)ifr_mac.ifr_hwaddr.sa_data[3],&&
&&&&&&&&&&&&(unsigned&char)ifr_mac.ifr_hwaddr.sa_data[4],&&
&&&&&&&&&&&&(unsigned&char)ifr_mac.ifr_hwaddr.sa_data[5]);&&
&&&&printf(&local&mac:%s&/n&,mac_addr);&&&&&&
&&&&close(&sock_mac&);&&
&&&&return&QString(&mac_addr&);&&
在linux下 获取,修改子网掩码NETMASK的两个函数
//获取子网掩码的函数
QString&GetLocalNetMask()&&
&&&&int&sock_&&
&&&&char&netmask_addr[50];&&
&&&&struct&ifreq&ifr_&&
&&&&struct&sockaddr_in&*net_&&
&&&&&&&&&&
&&&&sock_netmask&=&socket(&AF_INET,&SOCK_STREAM,&0&);&&
&&&&if(&sock_netmask&==&-1)&&
&&&&&&&&perror(&create&socket&failture...GetLocalNetMask/n&);&&
&&&&&&&&return&&&;&&
&&&&memset(&ifr_mask,&0,&sizeof(ifr_mask));&&&&&
&&&&strncpy(ifr_mask.ifr_name,&ifname,&sizeof(ifr_mask.ifr_name&)-1);&&&&&
&&&&if(&(ioctl(&sock_netmask,&SIOCGIFNETMASK,&&ifr_mask&)&)&&&0&)&&&
&&&&&&&&printf(&mac&ioctl&error/n&);&&
&&&&&&&&return&&&;&&
&&&&net_mask&=&(&struct&sockaddr_in&*&)&(&ifr_mask.ifr_netmask&);&&
&&&&strcpy(&netmask_addr,&inet_ntoa(&net_mask&-&&sin_addr&)&);&&
&&&&printf(&local&netmask:%s/n&,netmask_addr);&&&&&&
&&&&close(&sock_netmask&);&&
&&&&return&QString(&netmask_addr&);&&
//修改子NETMASK的函数
QString&SetLocalNetMask(const&char&*szNetMask)&&
&&&&int&sock_&&
&&&&char&netmask_addr[32];&&&&&
&&&&struct&ifreq&ifr_&&
&&&&struct&sockaddr_in&*sin_net_&&
&&&&&&&&&&
&&&&sock_netmask&=&socket(&AF_INET,&SOCK_STREAM,&0&);&&
&&&&if(&sock_netmask&==&-1)&&
&&&&&&&&perror(&Not&create&network&socket&connect/n&);&&
&&&&&&&&return&&&;&&
&&&&memset(&ifr_mask,&0,&sizeof(ifr_mask));&&&&&
&&&&strncpy(ifr_mask.ifr_name,&&eth0&,&sizeof(ifr_mask.ifr_name&)-1);&&&&&
&&&&sin_net_mask&=&(struct&sockaddr_in&*)&ifr_mask.ifr_&&
&&&&sin_net_mask&-&&sin_family&=&AF_INET;&&
&&&&inet_pton(AF_INET,&szNetMask,&&sin_net_mask&-&sin_addr);&&
&&&&if(ioctl(sock_netmask,&SIOCSIFNETMASK,&&ifr_mask&)&&&0)&&&
&&&&&&&&printf(&sock_netmask&ioctl&error/n&);&&
&&&&&&&&return&&&;&&
//获去GateWay
QString&GetGateWay()&&
&&&&FILE&*&&
&&&&char&buf[512];&&
&&&&char&cmd[128];&&
&&&&char&gateway[30];&&
&&&&char&*&&
&&&&strcpy(cmd,&&ip&route&);&&
&&&&fp&=&popen(cmd,&&r&);&&
&&&&if(NULL&==&fp)&&
&&&&&&&&perror(&popen&error&);&&
&&&&&&&&return&&&;&&
&&&&while(fgets(buf,&sizeof(buf),&fp)&!=&NULL)&&
&&&&&&&&tmp&=&&
&&&&&&&&while(*tmp&&&&isspace(*tmp))&&
&&&&&&&&&&&&&#43;&#43;&&&
&&&&&&&&if(strncmp(tmp,&&default&,&strlen(&default&))&==&0)&&
&&&&&&&&&&&&break;&&
&&&&sscanf(buf,&&%*s%*s%s&,&gateway);&&&&&&&&&
&&&&printf(&default&gateway:%s/n&,&gateway);&&
&&&&pclose(fp);&&
&&&&return&QString(gateway);&&
//设置网关
int&SetGateWay(const&char&*szGateWay)&&
&&&&int&ret&=&0;&&&&&&
&&&&char&cmd[128];&&
&&&&QString&DefGW&=&GetGateWay();&&
&&&&const&char&*strGW&=&DefGW.latin1();&&&
&&&&strcpy(cmd,&&route&del&default&gw&&);&&
&&&&strcat(cmd,&strGW);&&
&&&&ret&=&system(cmd);&&
&&&&if(ret&&&0)&&
&&&&&&&&perror(&route&error&);&&
&&&&&&&&return&-1;&&
&&&&strcpy(cmd,&&route&add&default&gw&&);&&
&&&&strcat(cmd,&szGateWay);&&
&&&&ret&=&system(cmd);&&
&&&&if(ret&&&0)&&
&&&&&&&&perror(&route&error&);&&
&&&&&&&&return&-1;&&
&&&&return&&&
Linux下如何获取网卡信息&&
00:12:26|&&分类:&&|字号&
有时候,写程序的时候需要获取计算机的网络信息,比如IP地址、电脑名称、DNS等信息。IP地址和电脑名称是比较容易获取到的,而要想获取地址掩码、DNS、网关等信息就有些麻烦了。
在Windows下我们一般都是通过从注册表读取这些信息。在Linux怎么做呢?其实,Linux下更加容易一些。因为我们可以拿现成的程序看它的源代码。通过阅读其源代码找到解决该问题的方法。那么,看哪个程序的源代码呢?如果你使用过Linux,并且比较熟悉的话就肯定知道一个命令ifconfig。这个命令和Windows下的ipconfig差不多,都可以输出网卡的信息,其中就包含DNS、掩码等信息。所以,我们可以通过看它的源代码来找到解决该问题的方法。
获取系统中的网卡数量
并没有那个系统调用提供网卡数量的获取。但是,我们可以通过强大的proc文件系统获取网卡数量的信息。实际上,ifconfig也是这样做的,请看示例代码如下:
0001 #include &stdio.h&
0002 #include &string.h&
0003 #include &errno.h&
0005 int GetNetCardCount()
0007 &&&&int nCount = 0;
0008 &&&&FILE* f = fopen(&/proc/net/dev&, &r&);
0009 &&&&if (!f)
0010 &&&&{
0011 &&&&&&&&fprintf(stderr, &Open /proc/net/dev failed!errno:%d\n&, errno);
0012 &&&&&&&&return nC
0013 &&&&}
0015 &&&&char szLine[512];
0017 &&&&fgets(szLine, sizeof(szLine), f);&&& /* eat line */
0018 &&&&fgets(szLine, sizeof(szLine), f);
0020 &&&&while(fgets(szLine, sizeof(szLine), f))
0021 &&&&{
0022 &&&&&&&&char szName[128] = {0};
0023 &&&&&&&&sscanf(szLine, &%s&, szName);
0024 &&&&&&&&int nLen = strlen(szName);
0025 &&&&&&&&if (nLen &= 0)continue;
0026 &&&&&&&&if (szName[nLen - 1] == ':') szName[nLen - 1] = 0;
0027 &&&&&&&&if (strcmp(szName, &lo&) == 0)continue;
0028 &&&&&&&&nCount&#43;&#43;;
0029 &&&&}
0031 &&&&fclose(f);
0032 &&&&f = NULL;
0033 &&&&return nC
0036 int main(int argc, char* argv[])
0038 &&&&printf(&NetCardCount: %d\n&, GetNetCardCount());
0039 &&&&return 0;
获取IP、掩码、MAC及网关
获取IP、掩码、MAC和广播地址是比较容易的,只需要调用对应的IOCTL即可。只是大家对Linux下的IOCTL可能不太熟悉。却看示例代码:
0001 void DispNetInfo(const char* szDevName)
0003 &&&&int s = socket(AF_INET, SOCK_DGRAM, 0);
0004 &&&&if (s & 0)
0005 &&&&{
0006 &&&&&&&&fprintf(stderr, &Create socket failed!errno=%d&, errno);
0007 &&&&&&&&return;
0008 &&&&}
0010 &&&&struct
0011 &&&&unsigned char mac[6];
0012 &&&&unsigned long nIP, nNetmask, nBroadIP;
0014 &&&&printf(&%s:\n&, szDevName);
0016 &&&&strcpy(ifr.ifr_name, szDevName);
0017 &&&&if (ioctl(s, SIOCGIFHWADDR, &ifr) & 0)
0018 &&&&{
0019 &&&&&&&&return;
0020 &&&&}
0021 &&&&memcpy(mac, ifr.ifr_hwaddr.sa_data, sizeof(mac));
0022 &&&&printf(&\tMAC: %02x-%02x-%02x-%02x-%02x-%02x\n&,
0023 &&&&&&&&&&&&mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
0025 &&&&strcpy(ifr.ifr_name, szDevName);
0026 &&&&if (ioctl(s, SIOCGIFADDR, &ifr) & 0)
0027 &&&&{
0028 &&&&&&&&nIP = 0;
0029 &&&&}
0030 &&&&else
0031 &&&&{
0032 &&&&&&&&nIP = *(unsigned long*)&ifr.ifr_broadaddr.sa_data[2];
0033 &&&&}
0034 &&&&printf(&\tIP: %s\n&, inet_ntoa(*(in_addr*)&nIP));
0036 &&&&strcpy(ifr.ifr_name, szDevName);
0037 &&&&if (ioctl(s, SIOCGIFBRDADDR, &ifr) & 0)
0038 &&&&{
0039 &&&&&&&&nBroadIP = 0;
0040 &&&&}
0041 &&&&else
0042 &&&&{
0043 &&&&&&&&nBroadIP = *(unsigned long*)&ifr.ifr_broadaddr.sa_data[2];
0044 &&&&}
0045 &&&&printf(&\tBroadIP: %s\n&, inet_ntoa(*(in_addr*)&nBroadIP));
0047 &&&&strcpy(ifr.ifr_name, szDevName);
0048 &&&&if (ioctl(s, SIOCGIFNETMASK, &ifr) & 0)
0049 &&&&{
0050 &&&&&&&&nNetmask = 0;
0051 &&&&}
0052 &&&&else
0053 &&&&{
0054 &&&&&&&&nNetmask = *(unsigned long*)&ifr.ifr_netmask.sa_data[2];
0055 &&&&}
0056 &&&&printf(&\tNetmask: %s\n&, inet_ntoa(*(in_addr*)&nNetmask));
0057 &&&&close(s);
&&&&&&&那么如何获取网关地址呢?更加容易,但是,好像很少有人知道。反正我在网上没有找到有人知道。最后看了nslookup的源代码以后才知道正确的做法。代码如下:
&&&&&&&res_init();&&&&&&
&&&&&&&for (int i = 0; i & _res. i&#43;&#43;)
&&&&&&&&&&&&&&struct sockaddr* server = (struct sockaddr*)&_res.nsaddr_list[i];
&&&&&&&&&&&&&&printf(&Server:&&%s\n&, inet_ntoa(*(in_addr*)&(server-&sa_data[2])));
代码很简单,就不做解释了。
怎么获取网关呢?这个稍微有点麻烦一些,不过和获取网卡数量相&#20284;,都是通过proc文件系统。这次分析的/proc/net/route文件。我就不再贴出示例代码了。
最后,我把运行示例程序获取到的信息附上,以供大家有个直观的认识:
&&&&&&&MAC: 08-00-27-98-bf-f3
&&&&&&&IP: 192.168.1.106
&&&&&&&BroadIP: 255.255.255.255
&&&&&&&Netmask: 255.255.255.0
Gateway: 192.168.1.1
&&&&&&&MAC: 08-00-27-16-f4-bf
&&&&&&&IP: 192.168.1.108
&&&&&&&BroadIP: 192.168.1.255
&&&&&&&Netmask: 255.255.255.0
Gateway: 0.0.0.0
&&&&&&&MAC: 08-00-27-37-9c-91
&&&&&&&IP: 0.0.0.0
&&&&&&&BroadIP: 0.0.0.0
&&&&&&&Netmask: 0.0.0.0
Gateway: 0.0.0.0
&&&&&&&MAC: 08-00-27-5a-d2-39
&&&&&&&IP: 0.0.0.0
&&&&&&&BroadIP: 0.0.0.0
&&&&&&&Netmask: 0.0.0.0
Gateway: 0.0.0.0
NetCardCount: 4
DNS 0:&&218.2.135.1
DNS 1:&&61.147.37.1
Linux下C语言配置网络与获取网络配置信息的方法
Linux下的网络配置包含三个要素,分别是IP地址、子网掩码和网关。本文将介绍如何在C语言中进行网络的配置和配置信息的获取。
使用system()或exec*()调用ifconfig和route命令进行配置。这种方法的优点是使用简单,缺点是效率比较低,且依赖于ifconfig与route命令。
见所附代码中的函数ip_config_system()和ip_config_exec()。
建立一个socket,用ioctl()进行配置。这种方法的优点是效率较高,缺点是程序实现起来比较麻烦。
见所附代码中的函数ip_config_ioctl()。
用popen()建立一个管道,管道的一端执行命令ifconfig和route,管道的另一端读取收到的数据并进行相应的解析。这种方法的优点是使用简单,缺点是效率比较低,且依赖于ifconfig与route命令。
见所附代码中的函数ip_get_pipe()。
用fopen()打开/proc/net/route,可以获取网关(在/proc/net中尚未发现比较好的获取IP地址和掩码的方法,知道的请发邮件至cugfeng
,谢谢)。这种方法的优点是使用简单,效率比执行命令高,缺点是依赖于proc文件系统。
见所附代码中的函数ip_get_proc()。
建立一个socket,用ioctl()进行获取(用ioctl()尚未发现比较好的获取网关的方法,知道的请发邮件至cugfeng ,谢谢)。这种方法的优点是效率较高,缺点是程序实现起来比较麻烦。
见所附代码中的函数ip_get_ioctl()。
BTW,用ioctl()的方法还可以获取MAC地址,ioctl()命令为SIOCGIFHWADDR,具体用法与ioctl()获取IP地址的方法相同,这里就不多说了。
LINUX下的getifaddrs()函数的内存释放问题&
在LINUX下获取网卡信息需要用到IOCTL或者getifaddrs&
而我在用getifaddrs的时候遇到了内存方面的问题&
先看相关定义:&
==========&
函数定义:&
/* Create a linked list of `struct ifaddrs' structures, one for each&
&& network interface on the host machine.& If successful, store the&
&& list in *IFAP and return 0.& On errors, return -1 and set `errno'.&
&& The storage returned in *IFAP is allocated dynamically and can&
&& only be properly freed by passing it to `freeifaddrs'.& */&
extern int getifaddrs (struct ifaddrs **__ifap) __THROW;&
/* Reclaim the storage allocated by a previous `getifaddrs' call.& */&
extern void freeifaddrs (struct ifaddrs *__ifa)& __THROW;&
==============&
此函数需要的结构体定义:&
struct ifaddrs&
& struct ifaddrs *ifa_&&&& /* Pointer to the next structure.& */&
& char *ifa_&&&&&&&&&&&&&& /* Name of this network interface.& */&
& unsigned int ifa_&&&&&& /* Flags as from SIOCGIFFLAGS ioctl.& */&
& struct sockaddr *ifa_&&& /* Network address of this interface.& */&
& struct sockaddr *ifa_ /* Netmask of this interface.& */&
&&& /* At most one of the following two is valid.& If the IFF_BROADCAST&
&&&&&& bit is set in `ifa_flags', then `ifa_broadaddr' is valid.& If the&
&&&&&& IFF_POINTOPOINT bit is set, then `ifa_dstaddr' is valid.&
&&&&&& It is never the case that both these bits are set at once.& */&
&&& struct sockaddr *ifu_ /* Broadcast address of this interface. */&
&&& struct sockaddr *ifu_ /* Point-to-point destination address.& */&
& /* These very same macros are defined by &net/if.h& for `struct ifaddr'.&
&&&& So if they are defined already, the existing definitions will be fine.& */&
# ifndef ifa_broadaddr&
#& define ifa_broadaddr ifa_ifu.ifu_broadaddr&
# ifndef ifa_dstaddr&
#& define ifa_dstaddr&& ifa_ifu.ifu_dstaddr&
& void *ifa_&&&&&&&&&&&&&& /* Address-specific data (may be unused).& */&
=============&
我在调用了getifaddrs()之后,正常地完成了需要的工作&
但是最后如果用freeifaddrs,则出现运行时错误&
*** glibc detected *** d: free(): invalid pointer: 0x ***&
======= Backtrace: =========&
/lib/libc.so.6[0xb7eda911]&
/lib/libc.so.6(__libc_free&#43;0x84)[0xb7edbf84]&
/lib/libc.so.6(freeifaddrs&#43;0x1d)[0xb7f512dd]&
d[0x8048989]&
d[0x80486a5]&
/lib/libc.so.6(__libc_start_main&#43;0xdc)[0xb7e8c87c]&
d[0x8048491]&
======= Memory map: ========&
49000 r-xp :07 48637 /home/souldump/bin/d&
4a000 rw-p :07 48637 /home/souldump/bin/d&
6b000 rw-p :00 0 [heap]&
b7d000 rw-p b7d 0&
b7d200 ---p b7d 0&
b7e700 rw-p b7e 0&
b7e700 r-xp :05 16184 /lib/libc-2.4.so&
b7f900 r--p :05 16184 /lib/libc-2.4.so&
b7f900 rw-p :05 16184 /lib/libc-2.4.so&
b7f900 rw-p b7f 0&
b7fab000-b7fb5000 r-xp :05 20108 /lib/libgcc_s.so.1&
b7fb00 rw-p :05 20108 /lib/libgcc_s.so.1&
b7fb00 rw-p b7fb 0&
b7fb00 r-xp :05 16177 /lib/ld-2.4.so&
b7fd00 rw-p :05 16177 /lib/ld-2.4.so&
bfb2b000-bfb41000 rw-p bfb2b000 00:00 0 [stack]&
ffffe000-fffff000 ---p :00 0 [vdso]&
实际上也有人出现相同问题:&
http://p./nph-proxy.cgi/000110A/http//bbs/viewthread.php=3ftid=3d10756&
此人说:&这说明不是真正的链表,指针非法&&
但是又没有进一步说明怎么解决&
他干脆没有调用freeifaddrs,自然会内存泄漏.....&
我去看了afaddrs.c&
freeifaddrs的定义居然是:&
freeifaddrs (struct ifaddrs *ifa)&
free (ifa);&
怎么样,很囧吧,明明在头文件里说&必须用freeifaddrs才能正确free...&&
然后我看了一下getifaddrs的函数体&
他在getifaddrs内部定义了一个结构&
struct ifaddrs_storage&
/* Save space for the biggest of the four used sockaddr types and&
avoid a lot of casts. */&
struct sockaddr_&
struct sockaddr_in s4;&
struct sockaddr_in6 s6;&
} addr, netmask,&
char name[IF_NAMESIZE &#43; 1];&
然后把获取的各网卡信息一个个填充到此结构的struct ifaddrs ifa中,ifa的next&#20540;手动设置为下一个struct ifaddrs_storage中的ifa的地址...&
这酒是所谓的&伪链表&吧?&
这就是我无法正确free掉它的原因?&
我究竟要怎么把它free掉?freeifaddrs一运行就运行时错误&
LINUX取得本机IP的简单C程序&
注意这里用了两个struct ifaddrs&
//代码根据UNP和man手册编写&
//适用于LINUX/BSD(FreeBSD, MacOS X)&
#include &stdio.h&&
#include &stdlib.h&&
#include &string.h&&
#include &time.h&&
#include &sys/types.h&&
#include &sys/socket.h&&
#include &netinet/in.h&&
#include &arpa/inet.h&&
#include &ifaddrs.h&&
int main(void)&
&&&&&&& struct ifaddrs&&&&&&& *ifc, *ifc1;&
&&&&&&& char&&&&&&&&&&&&&&& ip[64];&
&&&&&&& char&&&&&&&&&&&&&&& nm[64];&
&&&&&&& if (0 != getifaddrs(&ifc)) return(-1);&
&&&&&&& ifc1 =&
&&&&&&& printf(&Iface\tIP address\tNetmask\n&);&
&&&&&&& for(; NULL != ifc = (*ifc).ifa_next) {&
&&&&&&&&&&&&&&& printf(&%s&, (*ifc).ifa_name);&
&&&&&&&&&&&&&&& if (NULL != (*ifc).ifa_addr) {&
&&&&&&&&&&&&&&&&&&&&&&& inet_ntop(AF_INET, &(((struct sockaddr_in*)((*ifc).ifa_addr))-&sin_addr), ip, 64);&
&&&&&&&&&&&&&&&&&&&&&&& printf(&\t%s&, ip);&
&&&&&&&&&&&&&&& } else {&
&&&&&&&&&&&&&&&&&&&&&&& printf(&\t\t&);&
&&&&&&&&&&&&&&& }&
&&&&&&&&&&&&&&& if (NULL != (*ifc).ifa_netmask) {&
&&&&&&&&&&&&&&&&&&&&&&& inet_ntop(AF_INET, &(((struct sockaddr_in*)((*ifc).ifa_netmask))-&sin_addr), nm, 64);&
&&&&&&&&&&&&&&&&&&&&&&& printf(&\t%s&, nm);&
&&&&&&&&&&&&&&& } else {&
&&&&&&&&&&&&&&&&&&&&&&& printf(&\t\t&);&
&&&&&&&&&&&&&&& }&
&&&&&&&&&&&&&&& printf(&\n&);&
&&&&&&& }&
&&&&&&& freeifaddrs(ifc1);&
&&&&&&& return(0);&
--------------------------------------------------------------------------------&
============原来的============&
struct ifaddrs *ifap, *ifaphead, *ifaT&
getifaddrs(&ifap);&
ifaphead =&
while((ifapTmp = ifap) != NULL)&
//实际任务代码&&
ifap = ifapTmp-&ifa_&
freeifaddrs(ifaphead);&
=========修改后========&
struct ifaddrs *ifap, *&
getifaddrs(&ifap);&
ifaphead =&
while(ifap != NULL)&
//实际任务代码&&
ifap = ifa_&
freeifaddrs(ifaphead);&
==================&
仅仅是用了一个ifapTmp来代替ifap做事,区别仅此而已(而且我也忘了一开始为什么要用ifapTmp....)&
但是最后都是用了freeifaddrs(ifaphead)啊,并没有传错指针啊????&
中间的代码并没有对这段数据做任何修改啊.....&
请指教一下,这唯一的区别为什么会造成我原先的代码freeifaddrs失败?谢谢!&
ifaphead =&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //这里用ifaphead保存ifap指针地址&
while((ifapTmp = ifap) != NULL)&
ifap = ifapTmp-&ifa_&&&&&&&&&&&&&&& //这里修改了ifap的地址&
freeifaddrs(ifaphead);&&&&&&&&&&&&&&&&&&&&&& //由于ifap的地址修改,所以ifaphead已经是无效指针。&
使用ioctl的SIOCGIFCONF可以读取所有网卡信息。ioctl调用后返回指向ifconf的结构链表,其中包含了指向ifreq的结构指针。ifconf及ifreq定义在net/if.h中。
《UNIX网络编程》中提供了get_ifi_info函数的实现方法,使用这种方式来获取网络信息。在LINUX下,这种方式不能获得IPV6的网卡信息。《UNIX网络编程》中有如下描述:
在支持IPV6的系统中,没有关于对SIOCGIFCONF请求是否返回IPV6地址的标准。我们给支持IPV6的新系统增加了一个case语句, 这是为了预防万一。问题在于ifreq中的联合把返回的地址定义成一个通用的16字节套接口地址结构,适合16字节的IPV4 socket_in结构,但对于24字节的IPV6 socket_in6结构太小了。如果返回IPV6地址,将可能破环现有的在每个ifreq结构中采用固定大小的套接口地址结构的代码。
经测试,在fedor6-2.6.18kernel中无法返回ipv6地址,事实上,返回的地址簇总是AF_INET,而并非AF_INET6。
这种方法的实现代码如下:
#ifndef __NET_INF_H
#define __NET_INF_H
#define IFI_NAME 16
#define IFI_HADDR 8
typedef struct ifi_info
char ifi_name[IFI_NAME];
u_char ifi_haddr[IFI_HADDR];
u_short ifi_
short ifi_
short ifi_
struct sockaddr *ifi_
struct sockaddr *ifi_
struct sockaddr *ifi_
struct ifi_info *ifi_
#define IFI_ALIAS 1
struct ifi_info *get_ifi_info(int, int);
void free_ifi_info(struct ifi_info *);
#include &net_if.h&
ifi_info *get_ifi_info(int family, int doaliases)
ifi_info *ifi, *ifihead, **
int sockfd, len, lastlen, flags,
char *ptr, *buf, lastname[IFNAMSIZ], *
struct ifreq *ifr,
struct sockaddr_in *
if ((sockfd=socket(family, SOCK_DGRAM, 0))&0)
printf(&socket error.\n&);
lastlen = 0;
len = 10*sizeof(struct ifreq);
buf = (char*)malloc(len);
ifc.ifc_len =
ifc.ifc_buf =
if (ioctl(sockfd, SIOCGIFCONF, &ifc)&0)
if (errno!=EINVAL||lastlen!=0)
printf(&ioctl error.\n&);
if (ifc.ifc_len == lastlen)
lastlen = ifc.ifc_
len &#43;= 10*sizeof(struct ifreq);
free(buf);
ifihead = NULL;
ifipnext = &
lastname[0] = 0;
for (ptr = ptrifr-&ifr_addr.sa_len?sizeof(struct sockaddr):ifr-&ifr_addr.sa_
switch (ifr-&ifr_addr.sa_family)
#ifdef IPV6
case AF_INET6:
len = sizeof(struct sockaddr_in6);
case AF_INET:
len = sizeof(struct sockaddr);
ptr &#43;= sizeof(ifr-&ifr_name) &#43;
if (ifr-&ifr_addr.sa_family != family)
myflags = 0;
if ((cptr=strchr(ifr-&ifr_name, ':'))!=NULL)
*cptr = 0;
if (strncmp(lastname, ifr-&ifr_name, IFNAMSIZ)==0)
if (doaliases == 0)
myflags = IFI_ALIAS;
memcpy(lastname, ifr-&ifr_name, IFNAMSIZ);
ifrcopy = *
ioctl(sockfd, SIOCGIFFLAGS, &ifrcopy);
flags = ifrcopy.ifr_
if ((flags&IFF_UP)==0)
if ((flags&IFF_BROADCAST)==0)
ifi = calloc(1, sizeof(struct ifi_info));
*ifipnext =
ifipnext = &ifi-&ifi_
ifi-&ifi_flags =
ifi-&ifi_myflags =
memcpy(ifi-&ifi_name, ifr-&ifr_name, IFI_NAME);
ifi-&ifi_name[IFI_NAME-1] = '\0';
switch (ifr-&ifr_addr.sa_family)
case AF_INET:
sinptr = (struct sockaddr_in *)&ifr-&ifr_
if (ifi-&ifi_addr == NULL)
ifi-&ifi_addr = calloc(1, sizeof(struct sockaddr_in));
memcpy(ifi-&ifi_addr, sinptr, sizeof(struct sockaddr_in));
#ifdef SIOCGIFBRDADDR
if (flags & IFF_BROADCAST)
ioctl(sockfd, SIOCGIFBRDADDR, &ifrcopy);
sinptr = (struct sockaddr_in *)&ifrcopy.ifr_
ifi-&ifi_brdaddr = calloc(1, sizeof(struct sockaddr_in));
memcpy(ifi-&ifi_brdaddr, sinptr, sizeof(struct sockaddr_in));
#ifdef SIOCGIFDSTADDR
if (flags & IFF_POINTOPOINT)
ioctl(sockfd, SIOCGIFDSTADDR, &ifrcopy);
sinptr = (struct sockaddr_in*)&ifrcopy.ifr_
ifi-&ifi_dstaddr = calloc(1, sizeof(struct sockaddr_in));
memcpy(ifi-&ifi_dstaddr, sinptr, sizeof(struct sockaddr_in));
free(buf);
return(ifihead);
void free_ifi_info(ifi_info *ifihead)
ifi_info *ifi, *
for (ifi= ifi!=NULL; ifi=ifinext)
if (ifi-&ifi_addr!=NULL)
free(ifi-&ifi_addr);
if (ifi-&ifi_brdaddr!=NULL)
free(ifi-&ifi_brdaddr);
if (ifi-&ifi_dstaddr!=NULL)
free(ifi-&ifi_dstaddr);
ifinext = ifi-&ifi_
free(ifi);
char *sock_ntop(const struct sockaddr *sa, socklen_t salen)
char portstr[7];
static char str[128];
switch (sa-&sa_family)
case AF_INET:
struct sockaddr_in *sin = (struct sockaddr_in *)
if (inet_ntop(AF_INET, &sin-&sin_addr, str, sizeof(str))==NULL)
return NULL;
if (ntohs(sin-&sin_port)!=0)
snprintf(portstr, sizeof(portstr), &.%d&, ntohs(sin-&sin_port));
strcat(str, portstr);
case AF_INET6:
struct sockaddr_in6 *sin = (struct sockaddr_in6 *)
if (inet_ntop(AF_INET6, &sin-&sin6_addr, str, sizeof(str))==NULL)
return NULL;
if (ntohs(sin-&sin6_port)!=0)
snprintf(portstr, sizeof(portstr), &.%d&, ntohs(sin-&sin6_port));
strcat(str, portstr);
return NULL;
int main(int argc, char *argv[])
ifi_info *ifi, *
struct sockaddr *
int i, family,
if (argc!=3)
printf(&usage: ./prifinfo
if (strcmp(argv[1], &inet4&) == 0)
family = AF_INET;
#ifdef IPV6
else if (strcmp(argv[1], &inet6&) == 0)
family =AF_INET6;
printf(&invalid
doaliases = atoi(argv[2]);
for(ifihead = ifi = get_ifi_info(family, doaliases);
ifi!=NULL;ifi=ifi-&ifi_next)
printf(&%s:&&, ifi-&ifi_name);
if (ifi-&ifi_flags&IFF_UP) printf(&UP&);
if (ifi-&ifi_flags&IFF_BROADCAST) printf(&BCAST&);
if (ifi-&ifi_flags&IFF_MULTICAST) printf(&MCAST&);
if (ifi-&ifi_flags&IFF_LOOPBACK) printf(&LOOP&);
if (ifi-&ifi_flags&IFF_POINTOPOINT) printf(&P2P&);
printf(&&\n&);
if ((i=ifi-&ifi_hlen)&0)
ptr = ifi-&ifi_
printf(&%s%x&, (i==ifi-&ifi_hlen)?& &:&:&, *ptr&#43;&#43;);
}while(--i&0);
printf(&\n&);
if ((sa=ifi-&ifi_addr)!=NULL)
printf(& IP addr: %s\n&,
sock_ntop(sa, sizeof(*sa)));
if ((sa=ifi-&ifi_brdaddr)!=NULL)
printf(& broadcast addr: %s\n&,
sock_ntop(sa, sizeof(*sa)));
if ((sa=ifi-&ifi_dstaddr)!=NULL)
printf(& destnation addr: %s\n&,
sock_ntop(sa, sizeof(*sa)));
free_ifi_info(ifihead);
使用gcc net_if.c -o net_if -DIPV6编译,在IPV4模式下运行输出为:
[root@localhost net_if]./net_if inet4 1
IP addr: 127.0.0.1
IP addr: 192.168.1.2
broadcast addr: 192.168.1.255
IP addr: 192.168.125.99
broadcast addr: 192.168.125.255
执行./net_if inet6 1在输出为空。
第二种方式是使用getifaddrs函数获取,需要包含ifaddrs.h头文件,这种方式可以获得IPV6地址,改写的《UNIX网络编程》中的get_ifi_info函数如下所示:
#ifndef __ZNET_H__
#define __ZNET_H__
#define IFI_NAME 16
/* same as IFNAMSIZ in
#define IFI_HADDR
/* allow for 64-bit EUI-64 in future */
struct ifi_info {
ifi_name[IFI_NAME]; /* interface name, null-terminated */
/* interface index */
/* IFF_xxx constants from
struct sockaddr
*ifi_ /* primary address */
struct sockaddr
*ifi_/* broadcast address */
struct ifi_info
*ifi_ /* next of these structures */
struct ifi_info* get_ifi_info(int, int);
void free_ifi_info(struct ifi_info *);
#include &znet.h&
struct ifi_info* get_ifi_info(int family, int doaliases) {
struct ifi_info
*ifi, *ifihead, **ifipnext,*p;
struct sockaddr_in *
struct sockaddr_in6 *sin6
struct ifaddrs *
// char addr[128];
ifihead = NULL;
ifipnext = &
if(getifaddrs(&ifas)!=0)
for(;ifas!=NULL;ifas=(*ifas).ifa_next) {
if (((*ifas).ifa_addr)-&sa_family != family)
// ignore if not desired address family
printf(&%s %d\n&,(*ifas).ifa_name,((*ifas).ifa_addr)-&sa_family);
if(((*ifas).ifa_addr)-&sa_family!=AF_INET6)
inet_ntop(AF_INET,&(((struct sockaddr_in *)((*ifas).ifa_addr))-&sin_addr),addr,sizeof(addr));
inet_ntop(AF_INET6,&(((struct sockaddr_in6 *)((*ifas).ifa_addr))-&sin6_addr),addr,sizeof(addr));
printf(&%s\t&,addr);
printf(&\n&);
ifi = (struct ifi_info*)calloc(1,sizeof(struct ifi_info));
*ifipnext =
ifipnext = &ifi-&ifi_
ifi-&ifi_flags = (*ifas).ifa_
memcpy(ifi-&ifi_name, (*ifas).ifa_name, IFI_NAME);
ifi-&ifi_name[IFI_NAME-1] = '\0';
switch (((*ifas).ifa_addr)-&sa_family) {
case AF_INET:
sinptr = (struct sockaddr_in *) (*ifas).ifa_
ifi-&ifi_addr = (struct sockaddr*)calloc(1, sizeof(struct sockaddr_in));
memcpy(ifi-&ifi_addr, sinptr, sizeof(struct sockaddr_in));
#ifdef SIOCGIFBRDADDR
if (ifi-&ifi_flags & IFF_BROADCAST) {
sinptr = (struct sockaddr_in *) (*ifas).ifa_
ifi-&ifi_brdaddr = (struct sockaddr*)calloc(1, sizeof(struct sockaddr_in));
memcpy(ifi-&ifi_brdaddr, sinptr, sizeof(struct sockaddr_in));
case AF_INET6:
sin6ptr = (struct sockaddr_in6 *) (*ifas).ifa_
ifi-&ifi_addr = (struct sockaddr*)calloc(1, sizeof(struct sockaddr_in6));
memcpy(ifi-&ifi_addr, sin6ptr, sizeof(struct sockaddr_in6));
freeifaddrs(ifas);
return(ifihead);
int main(int argc, char *argv[]) {
if (argc!=2) {
printf(&usage: ./znet \n&);
if (strcmp(argv[1], &inet4&) == 0)
family = AF_INET;
else if (strcmp(argv[1], &inet6&) == 0)
family =AF_INET6;
printf(&invalid
char addr[128];
struct ifi_info *ifi, *
printf(&name\tflag\tIP\t\tbroadcastaddr\n&);
for (ifihead = ifi = get_ifi_info(family,1); ifi != NULL; ifi = ifi-&ifi_next) {
printf(&%s\t&,ifi-&ifi_name);
printf(&%d\t&,ifi-&ifi_flags);
if((ifi-&ifi_addr)-&sa_family!=AF_INET6)
inet_ntop(AF_INET,&(((struct sockaddr_in *)(ifi-&ifi_addr))-&sin_addr),addr,sizeof(addr));
inet_ntop(AF_INET6,&(((struct sockaddr_in6 *)(ifi-&ifi_addr))-&sin6_addr),addr,sizeof(addr));
printf(&%s\t&,addr);
#ifdef SIOCGIFBRDADDR
if ((ifi-&ifi_flags & IFF_BROADCAST) && (ifi-&ifi_addr)-&sa_family!=AF_INET6) {
inet_ntop(AF_INET,&(((struct sockaddr_in *) (ifi-&ifi_brdaddr))-&sin_addr),addr,sizeof(addr));
printf(&%s\t&,addr);
printf(&\n&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;\n&);
这段代码输出如下:
[root@localhost net_if]./znet inet4
name flag IP broadcastaddr
lo 73 127.0.0.1
&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;
eth1 .1.2 192.168.1.255
&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;
eth0 .125.99 192.168.125.255
&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;
[root@localhost net_if]./znet inet6
name flag IP broadcastaddr
&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;
&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:335595次
积分:3842
积分:3842
排名:第3410名
原创:11篇
转载:308篇
评论:37条
(1)(8)(3)(2)(3)(2)(4)(2)(2)(10)(6)(4)(3)(5)(7)(6)(11)(13)(8)(2)(5)(4)(24)(6)(15)(13)(3)(39)(23)(4)(7)(12)(21)(39)(1)(2)

我要回帖

更多关于 网关正在获取 的文章

 

随机推荐