c、c++混编实现查询本地IP地址

时间:2022-12-21 09:45:20

一、思路

  1、要想得到本地IP地址,可以通过本机名来查询,所以首先得得到本机名。

  2、牵涉到IP地址,首先想到牵涉到网络协议,因此得加载套接字协议,所以先使用WSAStartup函数完成对Winsock服务的初始化。

二、步骤

  c、c++混编实现查询本地IP地址

三、实现程序的模块化

  1、包含文件工作

#include <iostream.h>
#include <winsock2.h>
#include <windows.h>
#pragma comment(lib,"ws2_32.lib") bool GetLocalAddr();

  2、网络协议初始化工作

WSADATA wsaData;
WORD wVersionRequested;
wVersionRequested = MAKEWORD(,);
int initWSA = WSAStartup(wVersionRequested,&wsaData);

  3、通过主机名来获取本地连接的IP地址

  •   hostent是host entry的缩写,该结构记录主机的信息,包括主机名、别名、地址类型、地址长度和地址列表。
if ( == initWSA)
{
cout << "初始化完成!" << endl; // 获取主机名
char hostName[];
int iRet = gethostname(hostName,sizeof(hostName));
if (iRet != )
{
cout << "获取主机名失败!" << endl;
return false;
} // 通过主机名获取地址
//
hostent *hostInfo;
hostInfo = gethostbyname(hostName);
if (NULL == hostInfo)
{
cout << "通过主机名获取地址失败!" << endl;
return false;
} // 将网络地址转换成字符串,以便观看
char *IPAddr;
IPAddr = inet_ntoa(*(struct in_addr *)*hostInfo->h_addr_list);
cout << IPAddr << endl; // 卸载Winsock库,并释放所有资源
WSACleanup(); return true;
}
else
return false;

四、完整的程序

#include <iostream.h>
#include <winsock2.h>
#include <windows.h>
#pragma comment(lib,"ws2_32.lib") bool GetLocalAddr(); int main(void)
{
GetLocalAddr();
return ;
} bool GetLocalAddr()
{
// 初始化Winsock库
WSADATA wsaData;
WORD wVersionRequested;
wVersionRequested = MAKEWORD(,);
int initWSA = WSAStartup(wVersionRequested,&wsaData); if ( == initWSA)
{
cout << "初始化完成!" << endl; // 获取主机名
char hostName[];
int iRet = gethostname(hostName,sizeof(hostName));
if (iRet != )
{
cout << "获取主机名失败!" << endl;
return false;
} // 通过主机名获取地址
hostent *hostInfo;
hostInfo = gethostbyname(hostName);
if (NULL == hostInfo)
{
cout << "通过主机名获取地址失败!" << endl;
return false;
} // 将网络地址转换成字符串,以便观看
char *IPAddr;
IPAddr = inet_ntoa(*(struct in_addr *)*hostInfo->h_addr_list);
cout << IPAddr << endl; // 卸载Winsock库,并释放所有资源
WSACleanup(); return true;
}
else
return false;
}