我需要在webservices上找到本地机器的IP地址。在C#中,我有
ManagementObjectSearcher objC = new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = 'TRUE'");
ManagementObjectCollection objCollection = objC.Get();
我怎么能在C ++ Linux中做到这一点?
答案 0 :(得分:3)
getifaddrs()将返回机器中所有接口的结构列表。手册页底部有一个例子。
您也可以将ioctl与SIOCGIFCONF参数一起使用。有一个例子here
答案 1 :(得分:2)
我最喜欢的方式:
1.2.3.4是一个不可能的IP地址,恰好被所有主机视为outobund。 (如果他们曾经做过1. allocateatable,你将不得不使用0.2.3.4,它可能会调用未定义的行为)。
当然,您需要为IPv6更新此内容。
答案 2 :(得分:1)
您的具体问题将在以下页面中解答:
但是这里有关于BSD套接字的更多信息。 Beej's Guide to Network Programming是了解更多信息的好地方。
答案 3 :(得分:0)
Linux中的C ++使用系统调用'getifaddr'来获取你网卡的所有接口。这里有两个函数和一个你需要的结构。
struct ifaddrs{
struct ifaddrs *ifa_next; /* Pointer to the next structure. */
char *ifa_name; /* Name of this network interface. */
struct sockaddr *ifa_addr; /* Network address of this interface. */
...
}
int getifaddrs(struct ifaddrs **ifap); //to get all interface config fed to ifap
void freeifaddrs(struct ifaddrs *ifa); //to free ifa
以下是用户Twelve47在Get the IP address of the machine提供的示例,用于获取所有接口的IPv4和IPv6地址:
#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;
struct ifaddrs * ifa=NULL;
void * tmpAddrPtr=NULL;
getifaddrs(&ifAddrStruct);
for (ifa = ifAddrStruct; ifa != NULL; ifa = ifa->ifa_next) {
if (ifa ->ifa_addr->sa_family==AF_INET) { // check it is IP4
// is a valid IP4 Address
tmpAddrPtr=&((struct sockaddr_in *)ifa->ifa_addr)->sin_addr;
char addressBuffer[INET_ADDRSTRLEN];
inet_ntop(AF_INET, tmpAddrPtr, addressBuffer, INET_ADDRSTRLEN);
printf("'%s': %s\n", ifa->ifa_name, addressBuffer);
} else if (ifa->ifa_addr->sa_family==AF_INET6) { // check it is IP6
// is a valid IP6 Address
tmpAddrPtr=&((struct sockaddr_in6 *)ifa->ifa_addr)->sin6_addr;
char addressBuffer[INET6_ADDRSTRLEN];
inet_ntop(AF_INET6, tmpAddrPtr, addressBuffer, INET6_ADDRSTRLEN);
printf("'%s': %s\n", ifa->ifa_name, addressBuffer);
}
}
if (ifAddrStruct!=NULL)
freeifaddrs(ifAddrStruct);//remember to free ifAddrStruct
return 0;
}