C++ Linux 获得本地ip地址
时间: 2024-09-10 08:17:38 浏览: 47
在C++中,尤其是在Linux环境下,你可以通过读取网络接口文件或使用套接字API来获取本地IP地址。以下是一个简单的方法,通过读取`/etc/hostname`和`/etc/hosts`文件来获得主机名和IP地址,以及使用`getifaddrs`函数来获取所有网络接口的详细信息。
```cpp
#include <iostream>
#include <fstream>
#include <ifaddrs.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <unistd.h>
int main() {
// 从 /etc/hostname 获取主机名
std::ifstream hostnameFile("/etc/hostname");
std::string hostname;
if (hostnameFile.is_open()) {
std::getline(hostnameFile, hostname);
hostnameFile.close();
}
// 从 /etc/hosts 获取与主机名对应的IP地址
std::ifstream hostsFile("/etc/hosts");
std::string line;
std::string ip;
bool found = false;
if (hostsFile.is_open()) {
while (std::getline(hostsFile, line)) {
std::istringstream iss(line);
std::string currentHostname;
if (std::getline(iss, currentHostname, ' ') && currentHostname == hostname) {
if (std::getline(iss, ip, ' ')) {
found = true;
break;
}
}
}
hostsFile.close();
}
if (found) {
std::cout << "Hostname: " << hostname << std::endl;
std::cout << "IP Address: " << ip << std::endl;
} else {
std::cout << "Hostname not found in /etc/hosts" << std::endl;
}
// 使用 getifaddrs 获取所有网络接口的IP地址
struct ifaddrs *ifaddr, *ifa;
if (getifaddrs(&ifaddr) == -1) {
perror("getifaddrs");
return -1;
}
for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
if (ifa->ifa_addr == NULL) continue;
if (ifa->ifa_addr->sa_family == AF_INET) { // IPv4
// 获取网络接口名称
std::string interfaceName = ifa->ifa_name;
// 将套接字地址转换为IPv4地址
struct sockaddr_in *s = (struct sockaddr_in *)ifa->ifa_addr;
char ip[INET_ADDRSTRLEN];
inet_ntop(AF_INET, &s->sin_addr, ip, INET_ADDRSTRLEN);
std::cout << "Interface: " << interfaceName << " IP: " << ip << std::endl;
}
}
// 释放 getifaddrs 的资源
freeifaddrs(ifaddr);
return 0;
}
```
注意,这段代码仅供参考,实际情况中可能需要更复杂的错误处理和网络接口筛选逻辑。此外,直接从`/etc/hosts`中查找IP地址并不总是可靠,因为管理员可能不会在该文件中维护所有主机名到IP的映射,或者有多个IP对应同一个主机名。
阅读全文