网站酷站,用户体验设计软件,通信网站建设,wordpress插件 订阅有时候#xff0c;写程序的时候需要获取计算机的网络信息#xff0c;比如IP地址、电脑名称、DNS等信息。IP地址和电脑名称是比较容易获取到的#xff0c;而要想获取地址掩码、DNS、网关等信息就有些麻烦了。在Windows下我们一般都是通过从注册表读取这些信息。在Linux怎么做…有时候写程序的时候需要获取计算机的网络信息比如IP地址、电脑名称、DNS等信息。IP地址和电脑名称是比较容易获取到的而要想获取地址掩码、DNS、网关等信息就有些麻烦了。在Windows下我们一般都是通过从注册表读取这些信息。在Linux怎么做呢其实Linux下更加容易一些。因为我们可以拿现成的程序看它的源代码。通过阅读其源代码找到解决该问题的方法。那么看哪个程序的源代码呢如果你使用过Linux并且比较熟悉的话就肯定知道一个命令ifconfig。这个命令和Windows下的ipconfig差不多都可以输出网卡的信息其中就包含DNS、掩码等信息。所以我们可以通过看它的源代码来找到解决该问题的方法。获取系统中的网卡数量 并没有那个系统调用提供网卡数量的获取。但是我们可以通过强大的proc文件系统获取网卡数量的信息。实际上ifconfig也是这样做的请看示例代码如下#include #include #include int GetNetCardCount(){int nCount 0;FILE* f fopen(/proc/net/dev, r);if (!f){fprintf(stderr, Open /proc/net/dev failed!errno:%d\n, errno);return nCount;}char szLine[512];fgets(szLine, sizeof(szLine), f); /* eat line */fgets(szLine, sizeof(szLine), f);while(fgets(szLine, sizeof(szLine), f)){char szName[128] {0};sscanf(szLine, %s, szName);int nLen strlen(szName);if (nLen 0)continue;if (szName[nLen - 1] :) szName[nLen - 1] 0;if (strcmp(szName, lo) 0)continue;nCount;}fclose(f);f NULL;return nCount;}int main(int argc, char* argv[]){printf(NetCardCount: %d\n, GetNetCardCount());return 0;}获取IP、掩码、MAC及网关 获取IP、掩码、MAC和广播地址是比较容易的只需要调用对应的IOCTL即可。只是大家对Linux下的IOCTL可能不太熟悉。却看示例代码void DispNetInfo(const char* szDevName){int s socket(AF_INET, SOCK_DGRAM, 0);if (s 0){fprintf(stderr, Create socket failed!errno%d, errno);return;}struct ifreq ifr;unsigned char mac[6];unsigned long nIP, nNetmask, nBroadIP;printf(%s:\n, szDevName);strcpy(ifr.ifr_name, szDevName);if (ioctl(s, SIOCGIFHWADDR, ifr) 0){return;}memcpy(mac, ifr.ifr_hwaddr.sa_data, sizeof(mac));printf(\tMAC: %02x-%02x-%02x-%02x-%02x-%02x\n,mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);strcpy(ifr.ifr_name, szDevName);if (ioctl(s, SIOCGIFADDR, ifr) 0){nIP 0;}else{nIP *(unsigned long*)ifr.ifr_broadaddr.sa_data[2];}printf(\tIP: %s\n, inet_ntoa(*(in_addr*)nIP));strcpy(ifr.ifr_name, szDevName);if (ioctl(s, SIOCGIFBRDADDR, ifr) 0){nBroadIP 0;}else{nBroadIP *(unsigned long*)ifr.ifr_broadaddr.sa_data[2];}printf(\tBroadIP: %s\n, inet_ntoa(*(in_addr*)nBroadIP));strcpy(ifr.ifr_name, szDevName);if (ioctl(s, SIOCGIFNETMASK, ifr) 0){nNetmask 0;}else{nNetmask *(unsigned long*)ifr.ifr_netmask.sa_data[2];}printf(\tNetmask: %s\n, inet_ntoa(*(in_addr*)nNetmask));close(s);}那么如何获取网关地址呢更加容易但是好像很少有人知道。反正我在网上没有找到有人知道。最后看了nslookup的源代码以后才知道正确的做法。代码如下res_init();for (int i 0; i _res.nscount; i){struct sockaddr* server (structsockaddr*)_res.nsaddr_list[i];printf(Server: %s\n, inet_ntoa(*(in_addr*)(server-sa_data[2])));}代码很简单就不做解释了。怎么获取网关呢这个稍微有点麻烦一些不过和获取网卡数量相似都是通过proc文件系统。这次分析的/proc/net/route文件。我就不再贴出示例代码了。最后我把运行示例程序获取到的信息附上以供大家有个直观的认识eth0:MAC: 08-00-27-98-bf-f3IP: 192.168.1.106BroadIP: 255.255.255.255Netmask: 255.255.255.0Gateway: 192.168.1.1eth1:MAC: 08-00-27-16-f4-bfIP: 192.168.1.108BroadIP: 192.168.1.255Netmask: 255.255.255.0Gateway: 0.0.0.0eth2:MAC: 08-00-27-37-9c-91IP: 0.0.0.0BroadIP: 0.0.0.0Netmask: 0.0.0.0Gateway: 0.0.0.0eth3:MAC: 08-00-27-5a-d2-39IP: 0.0.0.0BroadIP: 0.0.0.0Netmask: 0.0.0.0Gateway: 0.0.0.0NetCardCount: 4DNS 0: 218.2.135.1DNS 1: 61.147.37.1