Linux c语言获取本机网关 ip 地址
文章目录
- 前言
- 一、获取本机网关 ip 地址
- 1.1 代码示例
- 1.2 代码详解介绍
- 二、使用Netlink套接字实时监控网络事件
- 2.1 简介
- 2.2 示例代码
前言
这篇文章写了获取本机的ip地址和子网掩码:Linux c语言获取本机 ip、子网掩码
一、获取本机网关 ip 地址
使用Netlink套接字从Linux内核的路由表中检索默认网关IP地址。
关于Netlink套接字请参考:Linux 网络之netlink 简介
1.1 代码示例
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <linux/netlink.h>
#include <linux/rtnetlink.h>
#include <unistd.h>#define BUFSIZE 8192struct nlreq {struct nlmsghdr hdr;struct rtmsg msg;
};int main(void)
{int sockfd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);if (sockfd == -1) {perror("socket error");exit(1);}struct sockaddr_nl sa;memset(&sa, 0, sizeof(sa));sa.nl_family = AF_NETLINK;if (bind(sockfd, (struct sockaddr *) &sa, sizeof(sa)) == -1) {perror("bind error");exit(1);}struct nlreq req;memset(&req, 0, sizeof(req));req.hdr.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg));req.hdr.nlmsg_type = RTM_GETROUTE;req.hdr.nlmsg_flags = NLM_F_REQUEST | NLM_F_DUMP;req.msg.rtm_family = AF_INET;req.msg.rtm_table = RT_TABLE_MAIN;req.msg.rtm_protocol = RTPROT_UNSPEC;req.msg.rtm_scope = RT_SCOPE_UNIVERSE;req.msg.rtm_type = RTN_UNICAST;struct iovec iov;memset(&iov, 0, sizeof(iov));iov.iov_base = &req;iov.iov_len = req.hdr.nlmsg_len;struct msghdr msg;memset(&msg, 0, sizeof(msg));msg.msg_name = &sa;msg.msg_namelen = sizeof(sa);msg.msg_iov = &iov;msg.msg_iovlen = 1;char buf[BUFSIZE];memset(buf, 0, sizeof(buf));struct nlmsghdr *hdr;int len;if (sendmsg(sockfd, &msg, 0) == -1) {perror("sendmsg error");exit(1);}while ((len = recv(sockfd, buf, sizeof(buf), 0)) > 0) {for (hdr = (struct nlmsghdr *) buf; NLMSG_OK(hdr, len); hdr = NLMSG_NEXT(hdr, len)) {if (hdr->nlmsg_type == NLMSG_DONE) {goto finish;}if (hdr->nlmsg_type == NLMSG_ERROR) {perror("NLMSG_ERROR");exit(1);}struct rtmsg *rt = (struct rtmsg *) NLMSG_DATA(hdr);if (rt->rtm_family != AF_INET || rt->rtm_table != RT_TABLE_MAIN || rt->rtm_type != RTN_UNICAST) {continue;}struct rtattr *attr;int attrlen;for (attr = (struct rtattr *) RTM_RTA(rt), attrlen = RTM_PAYLOAD(hdr); RTA_OK(attr, attrlen); attr = RTA_NEXT(attr, attrlen)) {if (attr->rta_type == RTA_GATEWAY) {char gw_addr[INET_ADDRSTRLEN];struct in_addr addr;memcpy(&addr, RTA_DATA(attr), sizeof(addr));if (inet_ntop(AF_INET, &addr, gw_addr, sizeof(gw_addr)) == NULL) {perror("inet_ntop error");continue;}printf("Gateway address: %s\n", gw_addr);goto finish;}}}}
finish:close(sockfd);return 0;
}
首先,它使用socket()函数创建一个Netlink套接字,并使用bind()将其绑定到本地地址。然后,它使用nlreq结构体变量初始化Netlink消息的参数。消息请求使用RTM_GETROUTE类型检索路由表,并指定要检索的路由的地址族、表、协议、范围和类型。消息还指定了NLM_F_DUMP标志以检索所有可用路由。
消息使用sendmsg()发送到内核,并使用recv()接收。接收到的数据通过一个循环解析缓冲区中的Netlink消息。该循环跳过与IPv4单播路由和主表无关的消息。对于每个相关消息,它使用另一个循环迭代路由属性,并检索网关地址(如果存在)。网关地址使用printf()打印到控制台,并使用goto语句退出循环。
1.2 代码详解介绍
(1)使用socket函数创建一个Netlink套接字
int sockfd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
if (sockfd == -1) {perror("socket error");exit(1);
}
/* Protocol families. */
#define PF_NETLINK 16/* Address families. */
#define AF_NETLINK PF_NETLINK
/* Types of sockets. */
enum __socket_type
{SOCK_RAW = 3, /* Raw protocol interface. */
#define SOCK_RAW SOCK_RAW
};
#define NETLINK_ROUTE 0 /* Routing/device hook */
(2)绑定套接字到本地地址
struct sockaddr_nl sa;
memset(&sa, 0, sizeof(sa));
sa.nl_family = AF_NETLINK;
if (bind(sockfd, (struct sockaddr *) &sa, sizeof(sa)) == -1) {perror("bind error");exit(1);
}
绑定套接字到本地地址。这是为了确保接收到内核发送的Netlink消息。
(3)创建一个Netlink消息
struct nlreq req;
memset(&req, 0, sizeof(req));
req.hdr.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg));
req.hdr.nlmsg_type = RTM_GETROUTE;
req.hdr.nlmsg_flags = NLM_F_REQUEST | NLM_F_DUMP;
req.msg.rtm_family = AF_INET;
req.msg.rtm_table = RT_TABLE_MAIN;
req.msg.rtm_protocol = RTPROT_UNSPEC;
req.msg.rtm_scope = RT_SCOPE_UNIVERSE;
req.msg.rtm_type = RTN_UNICAST;
创建一个Netlink消息,用于向内核请求路由表。我们设置消息头部的长度、类型和标志,以及rtmsg结构体的成员。这里我们只请求主路由表中的单播路由表项,以获取默认网关的地址。
(4)将req结构体打包成一个iovec结构体
struct iovec iov;
memset(&iov, 0, sizeof(iov));
iov.iov_base = &req;
iov.iov_len = req.hdr.nlmsg_len;struct msghdr msg;
memset(&msg, 0, sizeof(msg));
msg.msg_name = &sa;
msg.msg_namelen = sizeof(sa);
msg.msg_iov = &iov;
msg.msg_iovlen = 1;
将req结构体打包成一个iovec结构体,用于在消息中发送。我们还创建了一个msghdr结构体,指定发送和接收消息的参数。
(5)使用sendmsg函数将消息发送到内核
if (sendmsg(sockfd, &msg, 0) == -1) {perror("sendmsg error");exit(1);
}
(6)使用recv函数从内核接收消息
char buf[BUFSIZE];
memset(buf, 0, sizeof(buf));
struct nlmsghdr *hdr;
int len;
if (sendmsg(sockfd, &msg, 0) == -1) {perror("sendmsg error");exit(1);
}
while ((len = recv(sockfd, buf, sizeof(buf), 0)) > 0) {for (hdr = (struct nlmsghdr *) buf; NLMSG_OK(hdr, len); hdr = NLMSG_NEXT(hdr, len)) {if (hdr->nlmsg_type == NLMSG_DONE) {goto finish;}if (hdr->nlmsg_type == NLMSG_ERROR) {perror("NLMSG_ERROR");exit(1);}// 解析路由表项}
}
使用recv函数从内核接收消息,并使用NLMSG_OK、NLMSG_NEXT和NLMSG_DATA宏来循环遍历消息中的所有路由表项。
(7)获取默认网关的地址
struct rtmsg *rt = (struct rtmsg *) NLMSG_DATA(hdr);
if (rt->rtm_family != AF_INET || rt->rtm_table != RT_TABLE_MAIN || rt->rtm_type != RTN_UNICAST) {continue;
}
struct rtattr *attr;
int attrlen;
for (attr = (struct rtattr *) RTM_RTA(rt), attrlen = RTM_PAYLOAD(hdr); RTA_OK(attr, attrlen); attr = RTA_NEXT(attr, attrlen)) {if (attr->rta_type == RTA_GATEWAY) {char gw_addr[INET_ADDRSTRLEN];struct in_addr addr;memcpy(&addr, RTA_DATA(attr), sizeof(addr));if (inet_ntop(AF_INET, &addr, gw_addr, sizeof(gw_addr)) == NULL) {perror("inet_ntop error");continue;}printf("Gateway address: %s\n", gw_addr);goto finish;}
}
finish:close(sockfd);return 0;
}
/* Routing message attributes */enum rtattr_type_t {RTA_GATEWAY,
};
检查每个路由表项的类型和成员,以确定是否找到了默认网关的地址。如果找到了,使用inet_ntop函数将地址转换为可读形式,并打印它。
二、使用Netlink套接字实时监控网络事件
2.1 简介
可以使用Netlink套接字实时监控网络事件。Netlink是一种基于套接字的接口,用于与Linux内核通信。内核中的各个子系统都使用Netlink与用户空间应用程序通信,包括网络子系统。
网络子系统使用Netlink在某些网络事件发生时向用户空间应用程序发送消息,例如添加或删除网络接口、更改网络路由和更改网络地址。这些消息可以被用户空间应用程序用于实时监控网络事件。
要使用Netlink实时监控网络事件,您需要创建一个Netlink套接字,将其绑定到特定的Netlink协议,然后使用recv函数从内核接收Netlink消息。然后,您可以解析消息以提取有关已发生的网络事件的信息。
2.2 示例代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <linux/netlink.h>
#include <linux/rtnetlink.h>#define BUFFER_SIZE 4096int main(int argc, char *argv[]) {int netlinkSocket = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);if (netlinkSocket < 0) {perror("创建Netlink套接字失败");exit(EXIT_FAILURE);}struct sockaddr_nl addr;memset(&addr, 0, sizeof(addr));addr.nl_family = AF_NETLINK;addr.nl_groups = RTMGRP_LINK | RTMGRP_IPV4_IFADDR | RTMGRP_IPV6_IFADDR;if (bind(netlinkSocket, (struct sockaddr *)&addr, sizeof(addr)) < 0) {perror("将Netlink套接字绑定到地址失败");close(netlinkSocket);exit(EXIT_FAILURE);}char buffer[BUFFER_SIZE];struct iovec iov = { buffer, sizeof(buffer) };struct msghdr msg = { (void *)&addr, sizeof(addr), &iov, 1, NULL, 0, 0 };while (1) {ssize_t len = recvmsg(netlinkSocket, &msg, 0);if (len < 0) {perror("接收Netlink消息失败");close(netlinkSocket);exit(EXIT_FAILURE);}struct nlmsghdr *nlh;for (nlh = (struct nlmsghdr *)buffer; NLMSG_OK(nlh, len); nlh = NLMSG_NEXT(nlh, len)) {switch(nlh->nlmsg_type) {case RTM_NEWLINK:printf("检测到新链接\n");break;case RTM_DELLINK:printf("链接已删除\n");break;case RTM_NEWADDR:printf("检测到新地址\n");break;case RTM_DELADDR:printf("地址已删除\n");break;default:printf("未知的消息类型 (%d)\n", nlh->nlmsg_type);break;}}}close(netlinkSocket);return 0;
}
在一个终端上编译程序并运行。
在另一个终端上输入以下命令来更改网络接口的状态:
sudo ifconfig eth0 down
sudo ifconfig eth0 up
这只是一个简单的示例,可以使用Netlink监控许多其他类型的网络事件。
rtnetlink.h头文件提供了所有可能的Netlink消息类型的列表,可以用于监控其他类型的网络事件。
如下所示:
/***** Routing/neighbour discovery messages.****//* Types of messages */enum {RTM_BASE = 16,
#define RTM_BASE RTM_BASERTM_NEWLINK = 16,
#define RTM_NEWLINK RTM_NEWLINKRTM_DELLINK,
#define RTM_DELLINK RTM_DELLINKRTM_GETLINK,
#define RTM_GETLINK RTM_GETLINKRTM_SETLINK,
#define RTM_SETLINK RTM_SETLINKRTM_NEWADDR = 20,
#define RTM_NEWADDR RTM_NEWADDRRTM_DELADDR,
#define RTM_DELADDR RTM_DELADDRRTM_GETADDR,
#define RTM_GETADDR RTM_GETADDRRTM_NEWROUTE = 24,
#define RTM_NEWROUTE RTM_NEWROUTERTM_DELROUTE,
#define RTM_DELROUTE RTM_DELROUTERTM_GETROUTE,
#define RTM_GETROUTE RTM_GETROUTERTM_NEWNEIGH = 28,
#define RTM_NEWNEIGH RTM_NEWNEIGHRTM_DELNEIGH,
#define RTM_DELNEIGH RTM_DELNEIGHRTM_GETNEIGH,
#define RTM_GETNEIGH RTM_GETNEIGHRTM_NEWRULE = 32,
#define RTM_NEWRULE RTM_NEWRULERTM_DELRULE,
#define RTM_DELRULE RTM_DELRULERTM_GETRULE,
#define RTM_GETRULE RTM_GETRULERTM_NEWQDISC = 36,
#define RTM_NEWQDISC RTM_NEWQDISCRTM_DELQDISC,
#define RTM_DELQDISC RTM_DELQDISCRTM_GETQDISC,
#define RTM_GETQDISC RTM_GETQDISCRTM_NEWTCLASS = 40,
#define RTM_NEWTCLASS RTM_NEWTCLASSRTM_DELTCLASS,
#define RTM_DELTCLASS RTM_DELTCLASSRTM_GETTCLASS,
#define RTM_GETTCLASS RTM_GETTCLASSRTM_NEWTFILTER = 44,
#define RTM_NEWTFILTER RTM_NEWTFILTERRTM_DELTFILTER,
#define RTM_DELTFILTER RTM_DELTFILTERRTM_GETTFILTER,
#define RTM_GETTFILTER RTM_GETTFILTERRTM_NEWACTION = 48,
#define RTM_NEWACTION RTM_NEWACTIONRTM_DELACTION,
#define RTM_DELACTION RTM_DELACTIONRTM_GETACTION,
#define RTM_GETACTION RTM_GETACTIONRTM_NEWPREFIX = 52,
#define RTM_NEWPREFIX RTM_NEWPREFIXRTM_GETMULTICAST = 58,
#define RTM_GETMULTICAST RTM_GETMULTICASTRTM_GETANYCAST = 62,
#define RTM_GETANYCAST RTM_GETANYCASTRTM_NEWNEIGHTBL = 64,
#define RTM_NEWNEIGHTBL RTM_NEWNEIGHTBLRTM_GETNEIGHTBL = 66,
#define RTM_GETNEIGHTBL RTM_GETNEIGHTBLRTM_SETNEIGHTBL,
#define RTM_SETNEIGHTBL RTM_SETNEIGHTBLRTM_NEWNDUSEROPT = 68,
#define RTM_NEWNDUSEROPT RTM_NEWNDUSEROPTRTM_NEWADDRLABEL = 72,
#define RTM_NEWADDRLABEL RTM_NEWADDRLABELRTM_DELADDRLABEL,
#define RTM_DELADDRLABEL RTM_DELADDRLABELRTM_GETADDRLABEL,
#define RTM_GETADDRLABEL RTM_GETADDRLABELRTM_GETDCB = 78,
#define RTM_GETDCB RTM_GETDCBRTM_SETDCB,
#define RTM_SETDCB RTM_SETDCBRTM_NEWNETCONF = 80,
#define RTM_NEWNETCONF RTM_NEWNETCONFRTM_GETNETCONF = 82,
#define RTM_GETNETCONF RTM_GETNETCONFRTM_NEWMDB = 84,
#define RTM_NEWMDB RTM_NEWMDBRTM_DELMDB = 85,
#define RTM_DELMDB RTM_DELMDBRTM_GETMDB = 86,
#define RTM_GETMDB RTM_GETMDBRTM_NEWNSID = 88,
#define RTM_NEWNSID RTM_NEWNSIDRTM_DELNSID = 89,
#define RTM_DELNSID RTM_DELNSIDRTM_GETNSID = 90,
#define RTM_GETNSID RTM_GETNSIDRTM_NEWSTATS = 92,
#define RTM_NEWSTATS RTM_NEWSTATSRTM_GETSTATS = 94,
#define RTM_GETSTATS RTM_GETSTATS__RTM_MAX,
#define RTM_MAX (((__RTM_MAX + 3) & ~3) - 1)
};
相关文章:
Linux c语言获取本机网关 ip 地址
文章目录 前言一、获取本机网关 ip 地址1.1 代码示例1.2 代码详解介绍 二、使用Netlink套接字实时监控网络事件2.1 简介2.2 示例代码 前言 这篇文章写了获取本机的ip地址和子网掩码:Linux c语言获取本机 ip、子网掩码 一、获取本机网关 ip 地址 使用Netlink套接字…...
nginx部署本地项目如何让异地公网访问?服务器端口映射配置!
接触过IIS或apache的小伙伴们,对nginx是比较容易理解的,nginx有点类似,又有所差异,在选择使用时根据自己本地应用场景来部署使用即可。通过一些对比可能会更加清楚了解: 1.nginx是轻量级,比apache占用更少…...
云时代已至,新一代数据分析平台是如何实现的?
2023 年 5 月,由 Stackoverflow 发起的 2023 年度开发者调查数据显示,PostgreSQL 已经超越 MySQL 位居第一,成为开发人员首选。PostgreSQL 在国内的热度也越来越高。6 月 17 日,PostgreSQL 数据库技术峰会在成都顺利召开。本次大会…...
【C#】简单聊下Framework框架下的事务
框架用的多了,之前版本的事务都忘记了。本次简单聊下.net framework 4.8框架下本身的事务 目录 1、SqlClient2、TransactionScope3、引用 1、SqlClient 在 C# 中,使用 using 块可以方便地实现对资源的自动释放,但它不适用于实现事务处理。为…...
asyncPool并发执行请求函数
asyncPool应用场景 一个不太常见的极端场景,当我们为了某个操作需要发生异步请求的时候,等待所有异步请求都完成时进行某些操作。这个时候我们不在简简单单的发送 1 - 2 个请求而是 5 - 10个(其实极端场景式 很多很多个请求,这个…...
Ubuntu 22.04上安装NFS服务
1、使用如下命令安装NFS服务端软件: # 在主机上运行以下命令 orangepiorangepi5:~$ sudo apt install nfs-server 2、在配置NFS时需要使用用户uid和组gid,可以使用id命令查看 # 在主机上运行id命令 orangepiorangepi5:~$ id uid1000(orangepi) gid100…...
数据结构--双链表
数据结构–双链表 单链表 VS 双链表 单链表:无法逆向检索,有时候不太方便 双链表:可进可退,存储密度更低一丢丢 双链表的定义 typedef struct DNode {ElemType data;struct DNode *prior, *next; }DNode, *DLinkList;双链表的初…...
javassist 动态修改 jar 包中 class
Javassist(Java Programming Assistant)是一个用于在运行时操作字节码的库,它可以用于动态修改和操作Java类。使用Javassist,可以通过修改现有的类或创建新的类来实现动态修改Jar包中的类。 下面是一个简单的示例,展示…...
什么是CC攻击?
CC攻击:DDOS(分布式拒绝服务攻击)的一种。黑客利用代理服务器或者控制的肉鸡,向目标web网页发送大量的请求,致使CPU处理不过来这么多的请求,长期处于100%的状态。造成通过该页面访问的端口堵塞,正常请求进不来。 怎么…...
LeetCode解法汇总253. 重构 2 行二进制矩阵
目录链接: 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:力扣 描述: 给你一个 2 行 n 列的二进制数组: 矩阵是一个二进制矩阵࿰…...
ChatGPT实战:生成演讲稿
当众发言(演讲)是一种传达信息、观点和情感的重要方式。通过演讲,人们可以在公共场合表达自己的观点,向观众传递自己的知识和经验,激发听众的思考和行动。无论是商务演讲、学术讲座还是政治演说,演讲稿的写…...
在线搭建K8S,kubernetes集群v1.23.9,docker支持的最后一个版本
1. 部署环境主机(条件说明) master 192.168.186.128 CentOS Linux release 7.9.2009 (Core) node1 192.168.186.129 CentOS Linux release 7.9.2009 (Core) node2 192.168.186.130 CentOS Linux release 7.9.2009 (Core)2. 系统初始化-所有节点&am…...
http自动跳转https的配置方法
要将HTTP自动重定向到HTTPS,您需要在Web服务器上进行以下配置: 在Web服务器上安装SSL证书。 打开Web服务器配置文件(如Apache的httpd.conf或Nginx的nginx.conf)。 找到监听HTTP请求的端口(通常是80端口)。…...
重新初始化k8s集群
执行如下命令,所有节点都执行 kubeadm reset初始化集群,仅在master(centos01)上执行 [rootcentos01 opt]# kubeadm init --apiserver-advertise-address 192.168.109.130 --image-repository registry.aliyuncs.com/google_containers --kubernetes-ve…...
JetBrains编程IDE将具备Ai助手功能,或将提高开发速度
近日JetBrains发布博客文章宣布,本周所有基于IntelliJ的IDE和.NET工具的EAP版本都将具备AI助手功能。而这些操作或许将提高开发效率,并且这些AI助手也是使用自家的**ERP**模型和OpenAI服务。 JetBrains表示,当下AI助手功能主要体现在IDE的两…...
【网络原理】TCP/IP协议五层模型
🥊作者:一只爱打拳的程序猿,Java领域新星创作者,CSDN、阿里云社区优质创作者。 🤼专栏收录于:计算机网络原理 本期讲解协议、OSI七层模型、TCP/IP五层模型、网络设备所在的分层、数据的封装和分佣。 目录 …...
【备战秋招】每日一题:2023.05.10-华为OD机试(第二题)-解密
为了更好的阅读体检,可以查看我的算法学习博客 在线评测链接:P1307 题目内容 在全球恐怖主义危机下,一组间谍团队接收到了来自地下工作者的一串神秘代码。这组代码可以帮助他们访问恐怖分子的服务器,但是他们需要先解密代码才能使用它。代…...
【华为OD机试】矩阵最大值(python, java, c++, js)
矩阵最大值 前言:本专栏将持续更新华为OD机试题目,并进行详细的分析与解答,包含完整的代码实现,希望可以帮助到正在努力的你。关于OD机试流程、面经、面试指导等,如有任何疑问,欢迎联系我,wechat:steven_moda;email:nansun0903@163.com;备注:CSDN。 题目描述 给定…...
通过USB和wifi连接真机编写第一个脚本
目录 一、连接手机 1、通过usb数据线连接手机 2、无线连接手机 二、编写第一个脚本 一、连接手机 1、通过usb数据线连接手机 数据线连接手机并允许调试 cmd命令行执行: adb devices 如果没有显示device信息,请检查: 手机是否开启usb调…...
【javascript】 javascript对象函数 总结
Object.entries( ) 作用:返回一个数组,获取对象所有可枚举属性的名称 和 可枚举属性的值 const obj { a: 1, b: 2 }; const entries Object.entries(obj); console.log(entries); // [[a, 1], [b, 2]] Object.keys( ) 作用:返回一个数组…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
tauri项目,如何在rust端读取电脑环境变量
如果想在前端通过调用来获取环境变量的值,可以通过标准的依赖: std::env::var(name).ok() 想在前端通过调用来获取,可以写一个command函数: #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...
【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
若依登录用户名和密码加密
/*** 获取公钥:前端用来密码加密* return*/GetMapping("/getPublicKey")public RSAUtil.RSAKeyPair getPublicKey() {return RSAUtil.rsaKeyPair();}新建RSAUti.Java package com.ruoyi.common.utils;import org.apache.commons.codec.binary.Base64; im…...
C# winform教程(二)----checkbox
一、作用 提供一个用户选择或者不选的状态,这是一个可以多选的控件。 二、属性 其实功能大差不差,除了特殊的几个外,与button基本相同,所有说几个独有的 checkbox属性 名称内容含义appearance控件外观可以变成按钮形状checkali…...
window 显示驱动开发-如何查询视频处理功能(三)
D3DDDICAPS_GETPROCAMPRANGE请求类型 UMD 返回指向 DXVADDI_VALUERANGE 结构的指针,该结构包含特定视频流上特定 ProcAmp 控件属性允许的值范围。 Direct3D 运行时在D3DDDIARG_GETCAPS的 pInfo 成员指向的变量中为特定视频流的 ProcAmp 控件属性指定DXVADDI_QUER…...
初级程序员入门指南
初级程序员入门指南 在数字化浪潮中,编程已然成为极具价值的技能。对于渴望踏入程序员行列的新手而言,明晰入门路径与必备知识是开启征程的关键。本文将为初级程序员提供全面的入门指引。 一、明确学习方向 (一)编程语言抉择 编…...
