C/C++ 获取本机IP地址信息

这段代码使用了Winsock库来获取本地主机的IP地址。它定义了一个函数getIP(),该函数通过使用Winsock库的函数来获取本地主机名,并进一步获取主机的IP地址。

以下是代码的解释:

  1. 首先,包含了相关的头文件和使用Winsock库时需要链接的WS2_32.lib库。

  2. 接着定义了getIP()函数,用于获取本地主机的IP地址。

  3. getIP()函数中,首先进行了Winsock库的初始化,调用WSAStartup()函数。如果初始化成功,进一步获取本地主机名。这里使用了gethostname()函数,并将主机名存储在hostName字符数组中。

  4. 然后,调用gethostbyname()函数,传入hostName作为参数,该函数会返回hostent结构体指针,包含有关主机的详细信息,包括IP地址。

  5. 如果获取主机信息成功,将IP地址部分提取出来,并将其转换为字符串形式,然后返回。

  6. 如果在上述过程中出现任何错误,函数将返回字符串"Get IP failed."表示获取IP地址失败。

  7. main()函数中,调用getIP()函数获取本地主机的IP地址,并输出结果。

需要注意的是,该代码在Windows平台上运行,它将返回本地主机的IP地址,但请注意代码中使用的函数和库在其他平台上可能需要做适当调整。在运行代码之前,请确保已正确配置Winsock库。

#include<winsock2.h>  
#include<iostream>  
#include<string>

using namespace std;
#pragma comment(lib, "WS2_32.lib")

string getIP()
{
    WSADATA WSAData;
    char hostName[256];
    if (!WSAStartup(MAKEWORD(2, 0),&WSAData))
    {  
        if(!gethostname(hostName,sizeof(hostName)))
        {
            hostent *host=gethostbyname(hostName);
            if(host!=NULL)
            {
                return inet_ntoa(*(struct in_addr*)*host->h_addr_list);
            }
        }
    }      
    return "Get IP failed.";  
}

int main()
{
    cout<<"IP地址为:"<<getIP()<<endl;
    system("pause");
    return 0;   
}
Windows C语言中,可以使用Winsock API来获取本地计算机的IP地址和MAC地址。 以下是一个示例代码,它使用GetAdaptersAddresses函数来获取所有网络适配器的信息,包括IP地址和MAC地址: ```c #include <stdio.h> #include <stdlib.h> #include <winsock2.h> #include <iphlpapi.h> #include <ws2tcpip.h> #pragma comment(lib, "iphlpapi.lib") #pragma comment(lib, "ws2_32.lib") int main() { // 初始化Winsock库 WSADATA wsaData; int err = WSAStartup(MAKEWORD(2, 2), &wsaData); if (err != 0) { printf("WSAStartup failed with error: %d\n", err); return 1; } // 获取所有网络适配器的信息 PIP_ADAPTER_ADDRESSES pAddresses = NULL; ULONG outBufLen = 0; ULONG flags = GAA_FLAG_INCLUDE_PREFIX | GAA_FLAG_SKIP_ANYCAST | GAA_FLAG_SKIP_MULTICAST | GAA_FLAG_SKIP_DNS_SERVER; DWORD ret = GetAdaptersAddresses(AF_UNSPEC, flags, NULL, NULL, &outBufLen); if (ret == ERROR_BUFFER_OVERFLOW) { pAddresses = (IP_ADAPTER_ADDRESSES*)malloc(outBufLen); ret = GetAdaptersAddresses(AF_UNSPEC, flags, NULL, pAddresses, &outBufLen); } // 遍历所有网络适配器 if (ret == NO_ERROR) { PIP_ADAPTER_ADDRESSES pCurrAddresses = pAddresses; while (pCurrAddresses) { // 输出适配器名称 printf("Adapter name: %ws\n", pCurrAddresses->FriendlyName); // 遍历IP地址列表 PIP_ADAPTER_UNICAST_ADDRESS pUnicast = pCurrAddresses->FirstUnicastAddress; while (pUnicast) { // 输出IP地址和掩码 char szIP[64], szMask[64]; DWORD dwIP = pUnicast->Address.lpSockaddr->sa_family == AF_INET ? ((struct sockaddr_in*)pUnicast->Address.lpSockaddr)->sin_addr.S_un.S_addr : 0; DWORD dwMask = pUnicast->OnLinkPrefixLength; inet_ntop(AF_INET, &dwIP, szIP, sizeof(szIP)); inet_ntop(AF_INET, &dwMask, szMask, sizeof(szMask)); printf("IP address: %s/%s\n", szIP, szMask); // 获取MAC地址 char szMAC[64]; ULONG ulLen = sizeof(szMAC); if (SendARP(dwIP, 0, (PULONG)szMAC, &ulLen) == NO_ERROR) { printf("MAC address: %02X-%02X-%02X-%02X-%02X-%02X\n", szMAC[0], szMAC[1], szMAC[2], szMAC[3], szMAC[4], szMAC[5]); } // 下一个IP地址 pUnicast = pUnicast->Next; } // 下一个适配器 pCurrAddresses = pCurrAddresses->Next; } } // 释放内存 free(pAddresses); // 清理Winsock库 WSACleanup(); return 0; } ``` 该代码将遍历所有网络适配器,并输出它们的名称、IP地址和MAC地址。MAC地址的获取使用了SendARP函数。注意,该函数只能获取本地网络中的MAC地址,无法获取跨网络的MAC地址。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微软技术分享

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值