Здравствуйте,
Уже раз 5 на моей памяти в форумах поднимался вопрос по определению IP адресов локальной машины, решил выложить несколько реализаций.
Способ №1: Используя вызов WSAIoctl Winsock2 c кодом SIO_ADDRESS_LIST_QUERY
#include <iostream>
#include <winsock2.h>
#pragma comment (lib, "ws2_32.lib")
int main(void)
{
using std::cout;
using std::cerr;
using std::endl;
WSADATA wd;
SOCKET sock;
char buf[65535];
DWORD dwSize = 65535;
int nRet;
SOCKET_ADDRESS_LIST *pAddr;
SOCKADDR* saddr;
nRet = WSAStartup(MAKEWORD(2,0), &wd);
if(nRet != 0){
cerr << "WSAStartup fail with code " << nRet << endl;
return -1;
}
sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(sock == INVALID_SOCKET){
cerr << "socket fail with code " << WSAGetLastError() << endl;
return -2;
}
ZeroMemory(buf, 65535);
nRet = WSAIoctl(sock, SIO_ADDRESS_LIST_QUERY, NULL, 0, buf, 65535, &dwSize, NULL, NULL);
if(nRet != SOCKET_ERROR){
pAddr = reinterpret_cast<SOCKET_ADDRESS_LIST*>(buf);
nRet = pAddr->iAddressCount;
saddr = pAddr->Address->lpSockaddr;
while (0 < nRet--){
cout << inet_ntoa(reinterpret_cast<SOCKADDR_IN*>(saddr)->sin_addr) << endl;
saddr++;
}
nRet = 0;
}else {
cerr << "WSAIoctl fail with code " << WSAGetLastError() << endl;
nRet = -3;
}
closesocket(sock);
WSACleanup();
return nRet;
}
Способ №2: Используя IP Helper API
#include <iostream>
#include <windows.h>
#include <iphlpapi.h>
#pragma comment (lib, "iphlpapi")
void main (void)
{
using std::cout;
using std::cerr;
using std::endl;
char* buf;
PIP_ADAPTER_INFO pAdaptersInfo;
PIP_ADDR_STRING pAddr;
DWORD dwSize = 0;
if(GetAdaptersInfo(NULL, &dwSize) != ERROR_BUFFER_OVERFLOW){
cerr << "GetAdaptersInfo fail" << endl;
return;
}
buf = new char[dwSize];
if (!buf) return;
pAdaptersInfo = reinterpret_cast<PIP_ADAPTER_INFO>(buf);
if (GetAdaptersInfo (pAdaptersInfo, &dwSize) == ERROR_SUCCESS){
while (pAdaptersInfo){
pAddr = &pAdaptersInfo->IpAddressList;
while (pAddr){
cout <<"Address: " << pAddr->IpAddress.String << "/" <<
pAddr->IpMask.String << endl;
pAddr = pAddr->Next;
}
pAdaptersInfo = pAdaptersInfo->Next;
}
}
delete[] buf;
}
Чуть позже представлю ещё один способ..