[Win32]_[初级]_[获取Windows本机的所有IP地址]

本文介绍了在开发Win32本地程序时如何使用`gethostbyname`和`getaddrinfo`函数获取服务器本机的IPv4地址,同时提到了初始化和清理Winsock库的WSAStartup和WSACleanup方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

场景

  1. 开发Win32本地程序时,有时候需要本地启动一个Socket服务,监听客户端的访问。而其他机器的客户端访问肯定是需要知道这个机器的IP地址才能连接,那么如何获取服务器本机的IPv4地址呢?

说明

  1. 获取本机的IP地址,可以通过<winsock.h>gethostbyname函数获得。这个函数在MSDN上不建议使用,推荐使用的是<winsock2.h>getaddrinfo函数,新版的getaddrinfo函数可以获取IPv6地址。但是兼容低版本的系统gethostbyname还是可以用的,至少目前在Win11上还可以使用。

  2. 无论是使用<winsock.h>还是<winsock2.h>,都需要在全局环境(main)里调用一次WSAStartup初始化winsock(2)库,并且在不需要使用winsock(2)时调用WSACleanup();释放库资源。

例子

  1. 以下是获取本机所有IPv4的例子。

  2. 需要链接Ws2_32.lib库.

#include <Windows.h>
#include <winsock.h>
#include <iostream>
#include <vector>
#include <string>
#include <memory>

using namespace std;

static shared_ptr<vector<string>> QueryAllLocalIpv4()
{
	auto hostname = gethostbyname(NULL);
	if (!hostname) {
		cout << "Error Code: " << WSAGetLastError() << endl;
		return nullptr;
	}
	
	char **pAlias = NULL;
	int i = 0;
	cout << "Official name: " << hostname->h_name << endl;
	for (pAlias = hostname->h_aliases; *pAlias != 0; pAlias++)
		cout << "Alternate name #" << ++i << ":" << *pAlias << endl;
	

	if (hostname->h_addrtype != AF_INET)
		return nullptr;

	struct in_addr addr;
	auto result = make_shared<vector<string>>();
	while (hostname->h_addr_list[i] != 0) {
		addr.s_addr = *(u_long *)hostname->h_addr_list[i++];
		auto address = inet_ntoa(addr);
		cout << "IPv4 Address #" << i << ":" << address << endl;
		result->push_back(address);
	}
	return result;
}

int main()
{
	//  Initialize Winsock
	WSADATA wsaData;
	auto iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);

	auto result = QueryAllLocalIpv4();
	for (size_t i = 0; result && (i < result->size()); ++i) 
		cout << result->at(i) << endl;
	

	WSACleanup();
	return 0;
}

输出

Official name: QI7
IPv4 Address #1:192.168.3.38
192.168.3.38

参考

  1. gethostbyname function (winsock.h)

  2. Windows Sockets Error Codes (Winsock2.h)

  3. HOSTENT (winsock.h)

  4. getaddrinfo function (ws2tcpip.h)

内容概要:本文详细探讨了机组组合优化模型的构建,旨在通过合理安排各类发电机组的启停计划和优化出力分配,实现电力系统在经济性和稳定性上的最佳平衡。文章首先介绍了电力系统的四大主要组件——传统火电机组、风电机组、光伏机组和储能系统的参数及运行特性。接着,围绕最小化系统总运行成本这一目标,设计了优化目标函数,并明确了包括功率平衡约束、机组出力上下限约束、风光发电功率约束、弃风弃光约束、爬坡速率约束、储能系统荷电状态约束、充放电功率约束和充放电互斥约束在内的多项约束条件。最后,文章列出了求解机组组合优化模型所需的关键变量,如传统机组的开停状态、机组出力、启停成本、风电光伏实际出力、弃风弃光比例及储能系统的充放电功率和荷电状态,以实现系统的经济调度和可再生能源的最大化利用。 适合人群:从事电力系统研究、规划和调度工作的工程师和技术人员,以及对电力系统优化感兴趣的科研人员。 使用场景及目标:①帮助电力系统工程师理解不同类型发电机组的特点及其对系统稳定性、经济性和环保性的影响;②为制定合理的电力系统调度策略提供理论依据和技术支持;③促进可再生能源的有效整合,提高电力系统的灵活性和可靠性。 其他说明:本文提供的模型和方法不仅适用于当前的电力系统,也可为未来含高比例可再生能源接入的电力系统提供参考。文中涉及的具体数学公式和参数设定为实际应用提供了详细的指导,有助于提升电力系统的运行效率和经济效益。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Peter(阿斯拉达)

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

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

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

打赏作者

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

抵扣说明:

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

余额充值