c+winsock获取本地IP地址

// 获取本地IP地址.cpp : 定义控制台应用程序的入口点。
//vs2010编译通过

 

#include "stdafx.h"


#include<stdio.h>
#include <Winsock2.h>
#pragma comment(lib,"Ws2_32.lib")
void main()
{
 WSAData wsadata;
 WORD version=MAKEWORD(2,2);//指定winsock版本,高字节指定次版本号,低字节指定主版本号,这里第一个2是主版本,第二个2是次版本
 //初始化winsock
 WSAStartup(version,&wsadata);
 char name[100];
 //获取主机名
 gethostname(name,sizeof(name));
 printf("%s\n",name);
 hostent *p;
 //获取IP地址
 p=gethostbyname(name);
 printf("本地IP:%d.%d.%d.%d\n",(p->h_addr_list[0][0]&0x00ff),(p->h_addr_list[0][1]&0x00ff),(p->h_addr_list[0][2]&0x00ff),(p->h_addr_list[0][3]&0x00ff));
 system("pause");
 //释放winsock资源
 WSACleanup();
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Windows 上使用 C 语言获取本地 IP 地址可以使用 socket 编程。 首先,你需要包含以下头文件: ``` #include <winsock2.h> #include <ws2tcpip.h> ``` 然后你可以使用以下代码获取本地 IP 地址: ``` SOCKET sock; struct sockaddr_in sa; struct in_addr ip_addr; char hostname[1024]; // 初始化 Winsock WSADATA wsaData; int ret = WSAStartup(MAKEWORD(2, 2), &wsaData); if (ret != 0) { // 初始化失败,处理错误 } // 创建 socket sock = socket(AF_INET, SOCK_DGRAM, 0); if (sock == INVALID_SOCKET) { // 创建 socket 失败,处理错误 } // 获取主机名 gethostname(hostname, sizeof(hostname)); // 获取本地 IP 地址 struct hostent* host = gethostbyname(hostname); if (host == NULL) { // 获取主机信息失败,处理错误 } ip_addr = *(struct in_addr*) host->h_addr; // 关闭 socket 和清理 Winsock closesocket(sock); WSACleanup(); // 输出 IP 地址 printf("本地 IP 地址为:%s\n", inet_ntoa(ip_addr)); ``` 注意,你需要在程序结束时调用 WSACleanup() 来清理 Winsock 相关资源。 ### 回答2: 要在Windows上使用C语言实现获取本地IP地址,可以使用Winsock库中的相关函数。下面是一个简单的实现示例: ```c #include <stdio.h> #include <winsock2.h> #include <ws2tcpip.h> #pragma comment(lib, "ws2_32.lib") int main() { WSADATA wsaData; if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { printf("WSAStartup failed.\n"); return 1; } char hostname[256]; if (gethostname(hostname, sizeof(hostname)) != 0) { printf("Failed to get hostname.\n"); return 1; } struct hostent* host; if ((host = gethostbyname(hostname)) == NULL) { printf("Failed to get host information.\n"); return 1; } char* ip = inet_ntoa(*(struct in_addr*)host->h_addr); printf("Local IP Address: %s\n", ip); WSACleanup(); return 0; } ``` 该实现首先包括了所需的头文件,然后使用`WSAStartup`函数初始化Winsock库。接下来,使用`gethostname`函数获取本地主机名,再使用`gethostbyname`函数通过主机名获取本地主机的相关信息。最后,使用`inet_ntoa`函数将获取到的IP地址转换为字符串,并打印出来。 需要注意的是,这个实现只能获取到主机的第一个IP地址,如果一个主机有多个IP地址,可能无法获取到全部地址。 ### 回答3: 在Windows操作系统上,可以使用C语言来实现获取本地IP地址的功能。下面是一个简单的实现示例: 首先,我们可以使用Windows提供的`GetAdaptersAddresses`函数来获取本地网络适配器的信息。这个函数位于`iphlpapi.h`头文件中,需要链接`iphlpapi.lib`库。 接下来,我们可以通过遍历网络适配器列表来获取每个适配器的IP地址。首先,创建一个指向`PIP_ADAPTER_ADDRESSES`类型的指针变量 `pAdapterAddresses`,并将其初始化为NULL。然后,调用`GetAdaptersAddresses`函数来获取适配器列表,将返回的适配器信息保存在 `pAdapterAddresses` 中。 接下来,我们遍历适配器列表,并使用`IP_ADAPTER_ADDRESSES`结构体中的`FirstUnicastAddress`字段和`Next`指针来获取每个适配器的IP地址。具体步骤如下: 1. 首先,创建一个指向`IP_ADAPTER_UNICAST_ADDRESS`类型的指针变量 `pUnicastAddress`,并将其初始化为 `pAdapterAddresses->FirstUnicastAddress`。 2. 然后,使用`GetAdaptersAddresses`函数中返回的适配器信息中的`IP_ADAPTER_UNICAST_ADDRESS`结构体中的`Address`字段来获取IP地址。可以使用`pUnicastAddress->Address.lpSockaddr`来访问`SOCKADDR_IN`结构体的`sin_addr`字段得到IP地址。 3. 最后,使用`inet_ntoa`函数将IP地址转换为字符串形式输出。 下面是一个简化的示例代码: ```c #include <stdio.h> #include <winsock2.h> #include <iphlpapi.h> #pragma comment(lib, "iphlpapi.lib") #pragma comment(lib, "ws2_32.lib") int main() { PIP_ADAPTER_ADDRESSES pAdapterAddresses = NULL; PIP_ADAPTER_UNICAST_ADDRESS pUnicastAddress = NULL; DWORD dwBufferSize = 0; DWORD dwRetVal = 0; // 首先调用一次获取所需的缓冲区大小 dwRetVal = GetAdaptersAddresses(AF_UNSPEC, GAA_FLAG_INCLUDE_PREFIX, NULL, NULL, &dwBufferSize); if (dwRetVal != ERROR_BUFFER_OVERFLOW) { printf("Failed to get adapter addresses. Error code: %d\n", dwRetVal); return -1; } // 分配缓冲区 pAdapterAddresses = (PIP_ADAPTER_ADDRESSES)malloc(dwBufferSize); if (pAdapterAddresses == NULL) { printf("Failed to allocate memory.\n"); return -1; } // 获取适配器列表 dwRetVal = GetAdaptersAddresses(AF_UNSPEC, GAA_FLAG_INCLUDE_PREFIX, NULL, pAdapterAddresses, &dwBufferSize); if (dwRetVal != NO_ERROR) { printf("Failed to get adapter addresses. Error code: %d\n", dwRetVal); free(pAdapterAddresses); return -1; } // 遍历适配器列表并输出IP地址 PIP_ADAPTER_ADDRESSES pCurrentAdapter = pAdapterAddresses; while (pCurrentAdapter != NULL) { pUnicastAddress = pCurrentAdapter->FirstUnicastAddress; while (pUnicastAddress != NULL) { char szIPAddress[MAX_PATH] = { 0 }; sockaddr_in* pSockAddr = (sockaddr_in*)pUnicastAddress->Address.lpSockaddr; inet_ntop(AF_INET, &(pSockAddr->sin_addr), szIPAddress, MAX_PATH); printf("Adapter name: %s, IP address: %s\n", pCurrentAdapter->FriendlyName, szIPAddress); pUnicastAddress = pUnicastAddress->Next; } pCurrentAdapter = pCurrentAdapter->Next; } // 释放资源 free(pAdapterAddresses); return 0; } ``` 以上代码可以获取本地所有适配器的IP地址并输出到控制台。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值