Windows下socket编程怎么获取本机ip

方法一

我们可以在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{
		
		//本机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;
}

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。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小熊coder

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

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

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

打赏作者

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

抵扣说明:

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

余额充值