zoukankan      html  css  js  c++  java
  • C++获取本机IP地址(Win+linux)

    获取本机IP地址(Win+linux)

    #include <iostream>
    #include <optional>
    #include <string>
    
    #ifdef _WIN32
    #include <winsock2.h>
    #include <iphlpapi.h>
    #include <stdio.h>
    #include <stdlib.h>
    #pragma comment(lib, "IPHLPAPI.lib")
    #else
    #include <sys/types.h>
    #include <ifaddrs.h>
    #include <netinet/in.h>
    #include <string.h>
    #include <arpa/inet.h>
    #endif
    
    using namespace std;
    
    #define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))
    #define FREE(x) HeapFree(GetProcessHeap(), 0, (x))
    
    std::optional<std::string> GetIpAddress()
    {
    #ifdef _WIN32
    	PIP_ADAPTER_INFO pAdapterInfo;
    	PIP_ADAPTER_INFO pAdapter = NULL;
    	DWORD dwRetVal = 0;
    
    	ULONG ulOutBufLen = sizeof(IP_ADAPTER_INFO);
    	pAdapterInfo = (IP_ADAPTER_INFO *)MALLOC(sizeof(IP_ADAPTER_INFO));
    	if (pAdapterInfo == NULL) {
    		return std::nullopt;
    	}
    	
    	if (GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW) {
    		FREE(pAdapterInfo);
    		pAdapterInfo = (IP_ADAPTER_INFO *)MALLOC(ulOutBufLen);
    		if (pAdapterInfo == NULL) {
    			return std::nullopt;
    		}
    	}
    	
    	std::string ip_address;
    	if ((dwRetVal = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen)) == NO_ERROR) {
    		pAdapter = pAdapterInfo;
    		if (pAdapter) {
    			ip_address = pAdapter->IpAddressList.IpAddress.String;
    		}
    	}
    	
    	if (pAdapterInfo) {
    		FREE(pAdapterInfo);
    	}
    	
    	if (!ip_address.empty()) {
    		return ip_address;
    	}
    	return std::nullopt;
    
    #else
    	struct ifaddrs * ifAddrStruct = NULL;
    	struct ifaddrs * ifa = NULL;
    	void * tmpAddrPtr = NULL;
    
    	getifaddrs(&ifAddrStruct);
    	std::string ip_address;
    	for (ifa = ifAddrStruct; ifa != NULL; ifa = ifa->ifa_next) {
    		if (!ifa->ifa_addr) {
    			continue;
    		}
    		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);
    	
    			if (strcmp(ifa->ifa_name, "lo")) {
    				continue;
    			}
    			else {
    				ip_address = addressBuffer;
    				if (!ip_address.empty()) {
    					break;
    				}
    			}
    		}
    	}
    	if (ifAddrStruct != NULL) freeifaddrs(ifAddrStruct);
    	if (!ip_address.empty()) {
    		return ip_address;
    	}
    	else {
    		return std::nullopt;
    	}
    
    #endif
    }
    
    int main()
    {
    	auto res =  GetIpAddress();
    	if (res.has_value())
    	{
    		auto ip = res.value();
    		std::cout << ip << std::endl;
    	}
        std::cout << "Hello World!
    ";
    }
    

    参考链接:https://docs.microsoft.com/en-us/windows/win32/api/iphlpapi/nf-iphlpapi-getadaptersinfo

  • 相关阅读:
    join_tab计算代价
    outer join test
    突然觉得mysql优化器蛮简单
    将数据库字段从float修改为decimal
    小米初体验
    简述安装android开发环境
    Rust语言:安全地并发
    awk里的各种坑
    ubuntu下使用C语言开发一个cgi程序
    Ubuntu下安装和配置Apache2
  • 原文地址:https://www.cnblogs.com/LuckCoder/p/14310539.html
Copyright © 2011-2022 走看看