Windows下socket编程怎么获取本机ip_使用socke技术编写一段代码,完成获取本地主机的ip地址、子网掩码、网络关地

55 阅读2分钟
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{
	
	//本机IP:循环输出本机所有网卡的IP,其中包括虚拟网卡 
	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));
		//cout<<"第"<<i+1<<"块网卡的IP为:"<<inet\_ntoa(in)<<endl;
	}
}
WSACleanup();

}

void queryHostNameIP(char *host) { WSADATA data; if(WSAStartup(MAKEWORD(1,1),&data)!=0){ printf("初始化错误"); }

//char host[255];

struct hostent \*p=gethostbyname(host);
if(p==0){
	printf("无法获取%s的信息\n",host);
}
else{
	//本机IP:循环输出本机所有网卡的IP,其中包括虚拟网卡 
	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));
		//cout<<"第"<<i+1<<"块网卡的IP为:"<<inet\_ntoa(in)<<endl;
	}
}

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;  
 }


![img](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/e8177a214a8c4f8abc6bdc04989c81c9~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5py65Zmo5a2m5Lmg5LmL5b-DQUk=:q75.awebp?rk3s=f64ab15b&x-expires=1771252573&x-signature=v%2F98rqMeCf4LljCEkhLTdpKWJgY%3D)
![img](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/b5ca41854ad64be7894b964d794c7a40~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5py65Zmo5a2m5Lmg5LmL5b-DQUk=:q75.awebp?rk3s=f64ab15b&x-expires=1771252573&x-signature=TYq7EuJjNWQJ%2FuMaG9dYYPUIKdY%3D)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://gitee.com/vip204888)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**