C++ 获取本地IP,排除回环地址
时间: 2024-09-07 14:03:44 浏览: 70
在C++中,可以通过套接字编程来获取本地IP地址,并排除回环地址(通常是127.0.0.1)。以下是获取非回环本地IP地址的一种方法:
1. 使用`getaddrinfo`函数来获取本机地址列表。
2. 遍历地址列表,选择IPv4地址。
3. 检查是否为回环地址(地址以127开头)并排除。
4. 打印或使用非回环的IPv4地址。
下面是一个简单的示例代码:
```cpp
#include <iostream>
#include <string>
#include <cstring>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main() {
const char *hostname = "localhost";
struct addrinfo hints, *res, *p;
int status;
char ipstr[INET6_ADDRSTRLEN];
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC; // AF_INET 或 AF_INET6 来获取 IPv4 或 IPv6 的地址
hints.ai_socktype = SOCK_STREAM;
if ((status = getaddrinfo(hostname, NULL, &hints, &res)) != 0) {
std::cerr << "getaddrinfo error: " << gai_strerror(status) << std::endl;
return -1;
}
for (p = res; p != NULL; p = p->ai_next) {
void *addr;
if (p->ai_family == AF_INET) { // IPv4
struct sockaddr_in *ipv4 = (struct sockaddr_in *)p->ai_addr;
addr = &(ipv4->sin_addr);
}
// Convert the IP to a string and print it
inet_ntop(p->ai_family, addr, ipstr, sizeof ipstr);
if (std::string(ipstr).find("127.") == 0) {
// Skip loopback addresses
continue;
}
std::cout << "IP Address: " << ipstr << std::endl;
}
freeaddrinfo(res);
return 0;
}
```
在这段代码中,我们使用`getaddrinfo`来获取`localhost`的地址列表,然后遍历这个列表,排除以`127.`开头的地址,只打印非回环地址。
阅读全文