linux c/c++按規則獲取網絡卡ip
阿新 • • 發佈:2018-10-31
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;
}