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( ) 作用:返回一个数组…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...
HTML前端开发:JavaScript 获取元素方法详解
作为前端开发者,高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法,分为两大系列: 一、getElementBy... 系列 传统方法,直接通过 DOM 接口访问,返回动态集合(元素变化会实时更新)。…...
API网关Kong的鉴权与限流:高并发场景下的核心实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中,API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关,Kong凭借其插件化架构…...
flow_controllers
关键点: 流控制器类型: 同步(Sync):发布操作会阻塞,直到数据被确认发送。异步(Async):发布操作非阻塞,数据发送由后台线程处理。纯同步(PureSync…...
