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

2023-05-16

方法一

我们可以在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。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Windows下socket编程怎么获取本机ip 的相关文章

  • 软件定时器库

    前后台系统和多任务操作系统 xff0c 在简单功能上差别不大 xff0c 唯一不顺手的就是前后台系统没有合适的软件定时器 封装一层软件定时器接口 xff0c 对后续功能开发事半功倍 定义结构体数组 xff0c 其基础成员如下 xff1a s
  • 解决Raspberry系统ssh默认关闭的问题

    问题描述 xff1a 最近 xff0c 自己动手给树莓派3B安装了一个最新的系统 xff0c 本想通过SSH远程登录系统的时候 xff0c 发现登录不了 xff0c 具体表现为能ping通 xff0c 但是Xshell就是连不上 xff0c
  • mbedtls 库基础及其应用

    文章目录 1 引言1 1 为什么要加密1 2 SSL TLS协议的历史 2 SSL TLS演化2 1 明文时代2 2 对称加密时代2 3 非对称加密时代2 4 公证时代2 5 TLS协议时代2 6 TLS的应用 3 mbedtls3 1 软
  • 动态内存管理及防御性编程

    概述 xff1a C语言的优势是可以直接访问内存地址 xff0c 也就是指针操作 xff0c 但其缺陷也是因为直接内存访问 如何通过防御性编程提前发现问题 xff0c 尽可能减少内存异常产生的后果 xff0c 就是本文的重点 1 内存划分
  • 基于RTOS的软件开发理论

    文章目录 1 RTOS的特点2 任务设计2 1 任务的特性2 2 任务划分的方法2 2 1 设备依赖性任务2 2 2 关键任务2 2 3 紧迫任务2 2 4 数据处理任务2 2 5 触发条件相同的任务2 2 6 运行周期相同的任务2 2 7
  • 面向对象类之间主要的几种关系

    已剪辑自 https mp weixin qq com s ClBuraVUIPhnWceI7m78Xg 嵌入式开发虽然平时C语言用的比较多 xff0c 但面向对象的思维应该是每一位嵌入式软件工程师必备的知识 之前给大家分享过用C语言实现面
  • 世界上最健康的程序员作息表!

    文章目录 7 307 30 8 008 00 8 308 30 9 009 3010 3011 0013 0014 30 15 3016 0017 00 19 0019 3021 4523 0023 30时间 健康的小常识 已剪辑自 htt
  • 30岁了,冒死说几句大实话!

    已剪辑自 https mp weixin qq com s j0yzonrhPPcemDRF6QBVkw 是的 xff0c 我 30 岁了 xff0c 还是周岁 就在这上个周末 xff0c 我度过了自己 30 岁的生日 都说三十而立 xff
  • QT使用QAxObject读取Excel教程-全网最全

    文章目录 一 背景二 介绍基本操作方法获取对象调用动态方法设置和获取属性更多相关 三 使用要求添加模块与excel com连接的方法Excel基本操作 四 具体使用说明五 项目实战实战项目1实战项目2实战项目3实战项目4实战项目5 封装好的
  • 超越内卷-认知差、信息差、时间差

    已剪辑自 https mp weixin qq com s 9pzMQJJnp9ZbkTCVe ao7w 内卷的话题曾经聊过 xff0c 当大家的努力都上不了层次 xff0c 只是原水平重复竞争 xff0c 那么内卷就开始了 最近对这个问题
  • 数十种嵌入式 C 语言代码优化的经验和方法

    文章目录 简介声明哪里需要使用这些方法 xff1f 整形数除法和取余数合并除法和取余数通过2的幂次进行除法和取余数取模的一种替代方法使用数组下标全局变量使用别名变量的生命周期分割变量类型局部变量指针指针链条件执行布尔表达式和范围检查布尔表达
  • 汽车电子国际标准现状与趋势

    已剪辑自 https mp weixin qq com s vLgnrFPtDPglwde1TZUHSQ 在汽车电子系统发展的早期 xff0c 汽车电子基础软件是没有统一标准的 xff0c 各个 OEM Tier1 Tier2 等厂商针对不
  • Linux多线程服务器编程(陈硕)学习总结

    这本书确实是学习多核时代采用现代C 43 43 编写多线程程序的好书 xff0c 下面是学习总结 xff1a 第一章 线程安全的对象生命期管理 对象的创建很简单 xff0c 但是不要在构造期间泄漏this指针 xff0c 比如不要在构造函数
  • 详解 Modbus 通信协议(清晰易懂)

    文章目录 已剪辑自 https mp weixin qq com s dvo1l1GgJ2DtIHnPK5E1tA 本文总结关于 Modbus 相关的知识 xff0c 浅显易懂 xff0c 旨在对 Modbus 有一个很直观的了解 如有错误
  • RTOS应用中的几种调度策略

    从前后台架构的软件开发过渡到使用实时操作系统 RTOS 可能是一项困难的工作 但使用RTOS有许多优势 xff0c 例如简化应用集成 xff0c 支持任务抢占调度 xff0c 当开发人员使用复杂的32位微控制器 xff0c 且可以获取足够的
  • 几款非常棒的使用文本来进行图形化注释的工具

    https mp weixin qq com s NX8feH UPE7oegM7U9W4GA 说明 xff1a 1 程序代码里面非常好的注释方式 2 相关网站 xff1a xff08 1 xff09 https metacpan org
  • 解决Excel打开UTF-8编码CSV文件乱码的问题

    最近在用QT读写CSV文件 xff0c 发现将数据写入到CSV文件中 xff0c 使用记事本打开文件是正常的 xff0c 使用Excel打开 xff0c 中文是乱码的 xff0c 下面把原因和解决方法记录一下 问题产生的原因 为什么exce
  • Windows下查看端口占用情况

    编程的时候经常发现我们需要使用的端口被别的程序占用 xff0c 这个时候需要清楚查看是哪个程序占用了端口 xff0c 用且清除了这个进程 xff01 1 开始 gt 运行 gt cmd xff0c 或者是window 43 R组合键 xff
  • 【C进阶】同事用void把我给秀翻了!

    2 简单认识一下void 今天跟大家介绍的知识是C语言中的void关键字的用法 xff0c void在大部分小伙伴的程序中都只是用于函数无参数传入 xff0c 或者无类型返回 然而我们平时所定义的变量都会有具体的类型 xff0c int x
  • 如何降低代码圈复杂度

    已剪辑自 https mp weixin qq com s biz 61 MzI2MTE4Nzk5MA 3D 3D amp mid 61 2247483685 amp idx 61 1 amp sn 61 26072d6a41ed9abef

随机推荐