#include <winsock2.h> #include <iphlpapi.h> #include <stdlib.h> #include <string> #pragma comment(lib, "Ws2_32.lib") #pragma comment(lib, "IPHLPAPI.lib") std::string GetMaskFromIp(const std::string &ip) { std::string ret; PIP_ADAPTER_INFO pAdapterInfo; PIP_ADAPTER_INFO pAdapter = NULL; ULONG ulOutBufLen = sizeof (IP_ADAPTER_INFO); pAdapterInfo = (IP_ADAPTER_INFO *)malloc(sizeof (IP_ADAPTER_INFO)); if (ERROR_BUFFER_OVERFLOW == GetAdaptersInfo(pAdapterInfo, &ulOutBufLen)) { free(pAdapterInfo); pAdapterInfo = (IP_ADAPTER_INFO *) malloc(ulOutBufLen); } if (NO_ERROR == GetAdaptersInfo(pAdapterInfo, &ulOutBufLen)) { pAdapter = pAdapterInfo; while (pAdapter) { if (ip == pAdapter->IpAddressList.IpAddress.String) { ret = pAdapter->IpAddressList.IpMask.String; break; } // 在这里循环可以获取所有网卡信息 pAdapter = pAdapter->Next; } } if (pAdapterInfo) { free(pAdapterInfo); } return ret; } std::string GetLocalIp(SOCKET sock) { std::string ret; sockaddr_in localAddr; int addrLen = sizeof(localAddr); if (0 == getsockname(sock, (sockaddr*)&localAddr, &addrLen)) { ret = inet_ntoa(localAddr.sin_addr); } return ret; }