写一个获取本地ip的linux和Windows的c++实现
时间: 2024-03-20 21:38:37 浏览: 38
获取本地IP地址可以通过编写 C++ 程序来实现,下面分别给出在 Linux 和 Windows 操作系统下获取本地IP地址的实现。
在 Linux 下实现:
```c++
#include <iostream>
#include <string>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <ifaddrs.h>
int main() {
struct ifaddrs *ifAddrStruct = nullptr;
struct ifaddrs *ifa = nullptr;
void *tmpAddrPtr = nullptr;
getifaddrs(&ifAddrStruct);
std::string localIpAddress;
for (ifa = ifAddrStruct; ifa != nullptr; ifa = ifa->ifa_next) {
if (!ifa->ifa_addr) {
continue;
}
if (ifa->ifa_addr->sa_family == AF_INET) { // IPv4 Address
tmpAddrPtr = &((struct sockaddr_in *)ifa->ifa_addr)->sin_addr;
char addressBuffer[INET_ADDRSTRLEN];
inet_ntop(AF_INET, tmpAddrPtr, addressBuffer, INET_ADDRSTRLEN);
localIpAddress = addressBuffer;
std::cout << "IP Address: " << localIpAddress << std::endl;
}
}
if (ifAddrStruct != nullptr) {
freeifaddrs(ifAddrStruct);
}
return 0;
}
```
在 Windows 下实现:
```c++
#include <iostream>
#include <string>
#include <winsock2.h>
#include <iphlpapi.h>
#pragma comment(lib, "iphlpapi.lib")
int main() {
ULONG bufferSize = 0;
GetAdaptersAddresses(AF_UNSPEC, GAA_FLAG_INCLUDE_PREFIX, nullptr, nullptr, &bufferSize);
PIP_ADAPTER_ADDRESSES adapterAddresses = (PIP_ADAPTER_ADDRESSES) malloc(bufferSize);
GetAdaptersAddresses(AF_UNSPEC, GAA_FLAG_INCLUDE_PREFIX, nullptr, adapterAddresses, &bufferSize);
std::string localIpAddress;
PIP_ADAPTER_ADDRESSES adapterAddress = adapterAddresses;
while (adapterAddress) {
if (adapterAddress->OperStatus == IfOperStatusUp) {
PIP_ADAPTER_UNICAST_ADDRESS unicastAddress = adapterAddress->FirstUnicastAddress;
while (unicastAddress) {
if (unicastAddress->Address.lpSockaddr->sa_family == AF_INET) {
char addressBuffer[INET_ADDRSTRLEN];
inet_ntop(AF_INET, &((struct sockaddr_in*)unicastAddress->Address.lpSockaddr)->sin_addr, addressBuffer, INET_ADDRSTRLEN);
localIpAddress = addressBuffer;
std::cout << "IP Address: " << localIpAddress << std::endl;
}
unicastAddress = unicastAddress->Next;
}
}
adapterAddress = adapterAddress->Next;
}
free(adapterAddresses);
return 0;
}
```
需要注意的是,在 Windows 下需要链接 `iphlpapi.lib` 库。