C++ 获取C+中的本地IP地址+;Linux
我需要在一个Web服务上找到本地机器的IP地址。在C#中,我有 <如何在C++ Linux中实现?将返回机器中所有接口的结构列表。手册页底部有一个示例 还可以将ioctl与SIOCGIFCONF参数一起使用。有一个例子是我最喜欢的方式:C++ 获取C+中的本地IP地址+;Linux,c++,linux,C++,Linux,我需要在一个Web服务上找到本地机器的IP地址。在C#中,我有 ifa\U next){ 如果(ifa->ifa\u addr->sa\u family==AF\u INET){//检查它是否为IP4 //是有效的IP4地址 tmpAddrPtr=&((结构sockaddr_in*)ifa->ifa_addr)->sin_addr; 字符地址缓冲区[INET_ADDRSTRLEN]; inet_ntop(AF_inet,tmpAddrPtr,addressBuffer,inet_ADDRSTRL
当然,您需要为IPv6更新此选项。您的具体问题将在以下页面中得到解答:
但这里有更多关于BSD套接字的信息。这是一个学习更多知识的好地方 C++在linux中使用系统调用“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
以下是用户提供的获取所有接口的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;
}
#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,const char*argv[]{
结构ifaddrs*ifAddrStruct=NULL;
结构ifaddrs*ifa=NULL;
void*tmpAddrPtr=NULL;
getifaddrs(&ifaddstruct);
对于(ifa=ifAddrStruct;ifa!=NULL;ifa=ifa->ifa\U next){
如果(ifa->ifa\u addr->sa\u family==AF\u INET){//检查它是否为IP4
//是有效的IP4地址
tmpAddrPtr=&((结构sockaddr_in*)ifa->ifa_addr)->sin_addr;
字符地址缓冲区[INET_ADDRSTRLEN];
inet_ntop(AF_inet,tmpAddrPtr,addressBuffer,inet_ADDRSTRLEN);
printf(“%s”:%s\n,ifa->ifa\u名称,addressBuffer);
}否则,如果(ifa->ifa\u addr->sa\u family==AF\u INET6){//检查它是否为IP6
//是一个有效的IP6地址
tmpaddrpr=&((结构sockaddr\u in6*)ifa->ifa\u addr)->sin6\u addr;
字符地址缓冲区[INET6_ADDRSTRLEN];
inet_ntop(AF_INET6,tmpAddrPtr,addressBuffer,INET6_ADDRSTRLEN);
printf(“%s”:%s\n,ifa->ifa\u名称,addressBuffer);
}
}
if(ifaddstruct!=NULL)
freeifaddrs(ifaddstruct);//记住要释放ifaddstruct
返回0;
}
如果计算机上有多个网卡和多个接口,但只有一个网卡可以连接到公共互联网,该怎么办?从
#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;
}