1. 程式人生 > >linux c/c++按規則獲取網絡卡ip

linux c/c++按規則獲取網絡卡ip

linux c/c++按規則獲取網絡卡ip

輸出專案到雲或者輸出給外部客戶,會遇到伺服器多網絡卡多ip的情形,如果有多個應用都需要這個主機ip,而且多應用需要獲取相同的ip,此時可以約定一種規則來獲取相同的ip,比如: 獲得所有網絡卡名,然後對網絡卡名按從小到大排序,查詢最小的網絡卡名對應非local的ip,這樣每個應用都使用這種規則,就會獲取到相同的ip了,而且這種思路不受多種語言所限制。

詳細程式碼如下:

#include <iostream>
#include <stdio.h>
#include <ifaddrs.h>
#include <arpa/inet.h> #include <string.h> #include <unistd.h> #include <stdlib.h> using namespace std; int compare(const void *a,const void *b) { return strcmp(*(char **)a,*(char **)b); } int getSubnetMask(char ip[], int len) { struct sockaddr_in *sin = NULL; struct
ifaddrs *ifa = NULL, *ifList; string name[10]; if (getifaddrs(&ifList) < 0) { return -1; } int i = 0; //找到所有網絡卡,並列印網絡卡相關資訊 for (ifa = ifList; ifa != NULL; ifa = ifa->ifa_next) { if(ifa->ifa_addr->sa_family == AF_INET) { string
ifname(ifa->ifa_name); name[i]=ifname; i++; printf("interfaceName: %s\n", ifa->ifa_name); sin = (struct sockaddr_in *)ifa->ifa_addr; printf("ipAddress: %s\n", inet_ntoa(sin->sin_addr)); sin = (struct sockaddr_in *)ifa->ifa_dstaddr; printf("broadcast: %s\n", inet_ntoa(sin->sin_addr)); sin = (struct sockaddr_in *)ifa->ifa_netmask; printf("subnetMask: %s\n\n", inet_ntoa(sin->sin_addr)); } } //列印所有非空的網絡卡名 for (int i=0; i<sizeof(name)/sizeof(name[0]); i++) { if(strcmp(name[i].c_str(),"")) { printf("name%d=%s,",i,name[i].c_str()); } } printf("\n"); //從小到大排序 qsort(name,10,sizeof(name[0]),compare); //查詢最小網絡卡對應的ip for (int i=0; i<sizeof(name)/sizeof(name[0]); i++) { if (strcmp(name[i].c_str(),"")) { for (ifa = ifList; ifa != NULL; ifa = ifa->ifa_next) { if(ifa->ifa_addr->sa_family == AF_INET) { string ifname(ifa->ifa_name); if (strcmp(name[i].c_str(),ifname.c_str()) == 0) { printf("check name=%s\n",ifname.c_str()); sin = (struct sockaddr_in *)ifa->ifa_addr; char *ipAddress = inet_ntoa(sin->sin_addr); //過濾掉local if (strcmp(ipAddress,"127.0.0.1")) { strncpy(ip,ipAddress,len); printf("last use name=%s,ip=%s",name[i].c_str(),ip); freeifaddrs(ifList); return 0; } else { printf("is local, not use"); } } } } } } freeifaddrs(ifList); return -1; } int main(int argc, char *argv[]) { char ip[64]; if(int ret = getSubnetMask(ip,sizeof(ip)) < 0) { printf("find ip error\n"); return -1; } printf("ip=%s\n",ip); return 0; }