方法一
我们可以在cmd中敲入ipconfig来获取本机ip地址,下面写个程序来获取本机ip地址(结果相同):
#include<stdio.h>
#include<winsock2.h>
#pragma comment(lib,"ws2_32.lib")
void findIP(char *ip, int size)
{
WORD v = MAKEWORD(1, 1);
WSADATA wsaData;
WSAStartup(v, &wsaData);
struct hostent *phostinfo = gethostbyname("");
char *p = inet_ntoa (* ((struct in_addr *)(*phostinfo->h_addr_list)) );
strncpy(ip, p, size - 1);
ip[size - 1] = '\0';
WSACleanup( );
}
int main()
{
char ip[20] = {0};
findIP(ip, sizeof(ip));
printf("%s\n", ip);
return 0;
}
上面的程序仅仅获取一个ip, 那要获取所有ip, 怎么办呢? 很简单, 充分利用上面的list啊, 如下:
#include<stdio.h>
#include<winsock2.h>
#pragma comment(lib,"ws2_32.lib")
void getIPs()
{
WORD v = MAKEWORD(1, 1);
WSADATA wsaData;
WSAStartup(v, &wsaData);
int i = 0;
struct hostent *phostinfo = gethostbyname("");
for(i = 0; NULL != phostinfo&& NULL != phostinfo->h_addr_list[i]; ++i)
{
char *pszAddr = inet_ntoa(*(struct in_addr *)phostinfo->h_addr_list[i]);
printf("%s\n", pszAddr);
}
WSACleanup( );
}
int main()
{
getIPs();
return 0;
}
方法二
使用IDE新建一个C语言程序进行编写。代码如下:
#include <stdio.h>
#include <winsock2.h>
void queryLocalIP() {
WSADATA data;
if(WSAStartup(MAKEWORD(1,1),&data)!=0){
printf("初始化错误");
}
char host[255]="";
if(gethostname(host,sizeof(host))==SOCKET_ERROR){
printf("无法获取计算机主机名\n");
}
else{
printf("本机名称为:%s\n",host);
}
struct hostent *p=gethostbyname(host);
if(p==0){
printf("无法获取计算机主机名及IP\n");
}
else{
int i;
for(i=0;p->h_addr_list[i]!=0;i++){
struct in_addr in;
memcpy(&in,p->h_addr_list[i],sizeof(struct in_addr));
printf("本机的第%d块网卡的IP为:%s\n",i+1,inet_ntoa(in));
}
}
WSACleanup();
}
void queryHostNameIP(char *host) {
WSADATA data;
if(WSAStartup(MAKEWORD(1,1),&data)!=0){
printf("初始化错误");
}
struct hostent *p=gethostbyname(host);
if(p==0){
printf("无法获取%s的信息\n",host);
}
else{
int i;
for(i=0;p->h_addr_list[i]!=0;i++){
struct in_addr in;
memcpy(&in,p->h_addr_list[i],sizeof(struct in_addr));
printf("解析%s的第%d个IP为:%s\n",host,i+1,inet_ntoa(in));
}
}
WSACleanup();
}
int main(){
queryLocalIP();
printf("=================================\n");
char* hostname = "www.baidu.com";
queryHostNameIP(hostname);
printf("=================================\n");
printf("Ranly 2022/4/23");
return 0;
}
方法三:来自chatGPT
#include <stdio.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#pragma comment(lib, “ws2_32.lib”)
int main() {
WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != 0) {
printf(“WSAStartup failed: %d\n”, iResult);
return 1;
}
char host_name[256];
gethostname(host_name, sizeof(host_name));
struct addrinfo *result = NULL, *ptr = NULL, hints;
ZeroMemory(&hints, sizeof(hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
iResult = getaddrinfo(host_name, NULL, &hints, &result);
if (iResult != 0) {
printf("getaddrinfo failed: %d\n", iResult);
WSACleanup();
return 1;
}
char ip_address[16];
for (ptr = result; ptr != NULL; ptr = ptr->ai_next) {
struct sockaddr_in *addr_in = (struct sockaddr_in *) ptr->ai_addr;
strcpy(ip_address, inet_ntoa(addr_in->sin_addr));
}
printf("本机IP地址是:%s\n", ip_address);
freeaddrinfo(result);
WSACleanup();
return 0;
}
这个实测有点问题,不会获取所有ip,也不是第一块网卡的ip。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)