介休市政府网站/360网站推广客服电话
网络流量分析的原理基于对数据包的捕获、解析和统计分析,通过对网络流量的细致观察和分析,帮助管理员了解和优化网络的性能、提高网络安全性,并快速排查和解决网络故障和问题。
Linux中的网络流量常见类型
在Linux中,网络流量可以分为几种不同的类型。以下是一些常见的网络流量类型:
-
TCP流量:TCP(传输控制协议)是一种可靠的、面向连接的协议。TCP流量通常用于传输可靠的数据,例如网页浏览、文件传输等。
-
UDP流量:UDP(用户数据报协议)是一种无连接的协议,不保证数据的可靠性和顺序。UDP流量通常用于实时应用,如VoIP(网络电话)、视频流传输等。
-
ICMP流量:ICMP(Internet控制消息协议)用于传输网络控制消息和错误报告。ICMP流量通常用于网络故障排查、Ping命令等。
-
HTTP流量:HTTP(超文本传输协议)是一种应用层协议,用于在Web浏览器和服务器之间传输数据。HTTP流量通常用于网页浏览、下载文件等Web应用。
-
HTTPS流量:HTTPS是HTTP的安全版本,使用SSL(安全套接字层)或TLS(传输层安全)协议加密通信。HTTPS流量通常用于安全的Web传输,例如在线银行、电子商务等。
-
DNS流量:DNS(域名系统)用于将域名与IP地址相互映射。DNS流量通常用于解析域名、获取IP地址等。
-
FTP流量:FTP(文件传输协议)用于在客户端和服务器之间传输文件。FTP流量通常用于文件上传、下载等。
-
SSH流量:SSH(安全壳层)是一种加密的网络协议,用于安全和远程登录。SSH流量通常用于安全的远程管理和文件传输。
这些网络流量类型在不同的应用场景和协议中扮演着不同的角色。分析和监控不同类型的网络流量可以帮助管理员了解网络使用情况、排查故障并优化网络性能。
Linux下监控网络流量的目的
Linux下监控网络流量的目的有多个:
-
网络性能优化:监控网络流量可以帮助管理员了解网络的使用情况和瓶颈,以便进行性能优化和提高网络效率。
-
安全性增强:通过监控网络流量,可以及时发现异常的网络流量,如DDoS攻击、恶意软件传播等,以便及时采取相应的防御措施。
-
资源管理:监控网络流量可以帮助管理员了解各个主机或设备的网络使用情况,对网络资源进行分配和管理,以避免某个用户或设备占用过多的带宽和资源导致其他用户或设备受到影响。
-
计费和成本控制:监控网络流量可以帮助提供网络服务的机构或企业对用户的网络使用情况进行计费和成本控制,确保网络资源的合理利用和节约成本。
-
故障排查和问题定位:通过监控网络流量,可以及时发现网络故障、问题和异常,辅助管理员进行故障排除和问题定位,以减少网络停机时间和降低维护成本。
总而言之,监控网络流量可以提高网络性能、保障网络安全、管理网络资源、控制成本和故障排查,对于维护良好的网络运行非常重要。
有哪些专门的工具和技术分析网络流量
要实现Linux上的网络流量分析,可以使用一些专门的工具和技术。下面是一些常用的方法和原理:
-
使用抓包工具:在Linux上,可以使用像tcpdump、Wireshark这样的抓包工具来捕获网络数据包。这些工具可以监听网络接口,并将捕获到的数据包保存到文件中进行分析。
-
使用流量监控工具:像ntop、iftop、bmon等工具可以实时监控网络接口的流量情况,并提供统计信息和图形化展示。
-
分析捕获的数据包:捕获到的数据包可以使用Wireshark等工具进行解析和分析。Wireshark可以显示捕获的数据包的详细信息,如源IP地址、目的IP地址、协议类型、端口等,并提供过滤机制来筛选感兴趣的数据。
-
使用流量分析工具:除了抓包工具和流量监控工具,还有一些专门用于网络流量分析的工具,如tcpflow、Bro等。这些工具可以解析并分析网络流量中的各种协议,提供更深入的网络流量分析功能。
这些工具的实现原理都涉及到网络协议、socket编程、数据包的捕获和解析等知识。具体来说,抓包工具通过监听网络接口,将接收到的数据包保存到文件中;流量监控工具通过读取接口的流量数据并进行统计和展示;数据包分析工具和流量分析工具则依靠网络协议和数据包的解析来提供更深入的分析功能。
总体来说,实现网络流量分析需要一定的网络知识和编程技巧,同时需要使用相关工具和技术进行数据的捕获、解析和分析。
在Linux文件系统的/proc目录下分析网络流量
在Linux文件系统的/proc目录下,可以找到一些与网络流量相关的信息。以下是一些常见的文件和目录:
-
/proc/net/dev:这个文件提供了网络设备的收发网络流量统计信息,包括每个网络接口的接收和发送数据包数量、错误统计、丢弃的数据包数量等。
使用cat或者less命令:你可以使用cat或者less命令来查看/proc下的文件内容,例如:cat /proc/net/dev
可以查看网络设备的收发网络流量统计信息。
使用awk或者sed命令进一步处理:你可以使用awk或者sed命令来处理和过滤数据,例如:
cat /proc/net/dev | awk '{print $1, $2}'
可以只打印出网络设备名称和接收流量的统计值.
-
/proc/net/tcp:这个文件提供了当前TCP连接的详细信息,包括本地和远程IP地址、端口号,连接状态,以及一些统计信息。
使用grep命令筛选:你可以使用grep命令来筛选你感兴趣的信息,例如:grep "ESTABLISHED" /proc/net/tcp
可以查看当前所有TCP连接中状态为ESTABLISHED的连接信息。 -
/proc/net/udp:类似于/proc/net/tcp文件,提供了当前UDP连接的详细信息。
-
/proc/net/raw:提供了当前原始套接字(RAW socket)的相关信息,包括本地和远程IP地址、协议类型等。
-
/proc/net/snmp:提供了简单网络管理协议(SNMP)相关的统计信息,包括接口、IP、TCP、UDP等各层的统计信息。
-
/proc/net/ip_conntrack:如果系统启用了连接跟踪(conntrack)功能,这个文件提供了关于当前连接的跟踪信息,包括连接状态、源IP地址、目的IP地址、端口号等。
这些文件提供了一些基本的网络流量统计和连接信息,可以通过读取这些文件进行分析和监控。想要更加深入和详细地分析网络流量,则需要使用更专业的网络流量分析工具。
Linux C/C++ 网络流量分析
代码中网络流量分析是一个用于网络统计的命令行工具,用于监视系统网络接口的流量、带宽使用情况以及与网络相关的统计数据。它可以提供网络传输的各种统计信息,包括数据包的数量、字节数、错误、丢包等。
/** 接口统计信息*/
typedef struct nic_stats {struct timeval tv; /* tv_sec, tv_usec */uint64_t rbytes; /* total read bytes */uint64_t wbytes; /* total written bytes */uint64_t rpackets; /* total read packets */uint64_t wpackets; /* total written packets */uint64_t ierr; /* total input errors */uint64_t oerr; /* total output errors */uint64_t coll; /* total collisions */uint64_t nocp; /* total nocanput */uint64_t defer; /* total defers */uint64_t sat; /* saturation value */
} nicstats_t;/** print_header - 打印标题行*/
static void
print_header(void)
{if (g_style)(void) printf("%8s %5s %14s %14s\n","Time", "Int", "rKb/s", "wKb/s");else(void) printf("%8s %5s %7s %7s %7s %7s %7s %7s %7s %7s\n","Time", "Int", "rKb/s", "wKb/s", "rPk/s","wPk/s", "rAvs", "wAvs", "%Util", "Sat");
}static int split_ifname(char *if_name, char *drv, uint32_t *instance)
{
...n = 0;for (p = if_name; *p; p++)n++;if (n <= 1)return (B_FALSE);m = n;for (p--; isdigit(*p); p--)n--;if (m == n || n == 0)return (B_FALSE);(void) strncpy(drv, if_name, n);drv[n] = '\0';*instance = (uint32_t)atol(++p);
...
}
...
static void update_ksp_by_type(kstat_t **kspp, uint32_t types, char *name)
{
...if (types & KS_LINK) {*kspp = fetch_ksp("link", 0, name);return;}(void) split_ifname(name, drv, &instance);if (types & KS_DRV_MAC) {*kspp = fetch_ksp(drv, instance, "mac");return;}if (types & KS_DIN) {*kspp = fetch_ksp(drv, instance, name);return;}if (types & KS_DRV) {*kspp = fetch_ksp(drv, instance, NULL);return;}if (types & KS_NAME) {*kspp = fetch_ksp(name, -1, NULL);return;}...
}
static void update_stats(void)
{
...(void) gettimeofday(&now_tv, NULL);if (g_tcp) {/* 更新TCP统计信息 */if (g_new_kstat_chain) {g_tcp_ksp = kstat_lookup(g_kc, "tcp", -1, "tcp");if (! g_tcp_ksp)die(1, "kstat_lookup");}if (kstat_read(g_kc, g_tcp_ksp, NULL) < 0)die(1, "kstat_read");g_tcp_new->tv.tv_sec = now_tv.tv_sec;g_tcp_new->tv.tv_usec = now_tv.tv_usec;TCP_UPDATE(inDataInorderSegs, "inDataInorderSegs");TCP_UPDATE(outDataSegs, "outDataSegs");TCP_UPDATE(inDataInorderBytes, "inDataInorderBytes");TCP_UPDATE(inDataUnorderSegs, "inDataUnorderSegs");TCP_UPDATE(inDataUnorderBytes, "inDataUnorderBytes");TCP_UPDATE(outDataBytes, "outDataBytes");TCP_UPDATE(estabResets, "estabResets");TCP_UPDATE(outRsts, "outRsts");TCP_UPDATE(attemptFails, "attemptFails");TCP_UPDATE(retransBytes, "retransBytes");TCP_UPDATE(passiveOpens, "passiveOpens");TCP_UPDATE(activeOpens, "activeOpens");TCP_UPDATE(halfOpenDrop, "halfOpenDrop");TCP_UPDATE(listenDrop, "listenDrop");TCP_UPDATE(listenDropQ0, "listenDropQ0");}if (g_udp) {/* 更新UDP统计信息 */if (g_new_kstat_chain) {g_udp_ksp = kstat_lookup(g_kc, "udp", -1, "udp");if (! g_udp_ksp)die(1, "kstat_lookup");}if (kstat_read(g_kc, g_udp_ksp, NULL) < 0)die(1, "kstat_read");g_udp_new->tv.tv_sec = now_tv.tv_sec;g_udp_new->tv.tv_usec = now_tv.tv_usec;UDP_UPDATE(inDatagrams, "inDatagrams");UDP_UPDATE(outDatagrams, "outDatagrams");UDP_UPDATE(inErrors, "inErrors");UDP_UPDATE(outErrors, "outErrors");}if (g_style == STYLE_NONE && ! g_list)return;/* 更新接口统计信息 */for (nicp = g_nicdatap; nicp; nicp = nicp->next) {if (! (nicp->flags & NIC_UP))/* 链接未打开 */continue;if (g_nonlocal && (nicp->flags & NIC_LOOPBACK))continue;if (! (nicp->flags & NIC_OK_UPDATED))if (kstat_read(g_kc, nicp->op_ksp, NULL) < 0)die(1, "kstat_read");/* 保存网络值 */nicp->new.tv.tv_sec = now_tv.tv_sec;nicp->new.tv.tv_usec = now_tv.tv_usec;nicp->new.rbytes =fetch6432(nicp->op_ksp, "rbytes64", "rbytes", 0);nicp->new.wbytes =fetch6432(nicp->op_ksp, "obytes64", "obytes", 0);nicp->new.rpackets =fetch6432(nicp->op_ksp, "ipackets64", "ipackets", 0);nicp->new.wpackets =fetch6432(nicp->op_ksp, "opackets64", "opackets", 0);switch (g_style) {case STYLE_EXTENDED_PARSEABLE:case STYLE_EXTENDED:nicp->new.ierr = fetch32(nicp->op_ksp, "ierrors", 0);nicp->new.oerr = fetch32(nicp->op_ksp, "oerrors", 0);/*FALLTHROUGH*/case STYLE_FULL:case STYLE_SUMMARY:nicp->new.coll = fetch32(nicp->op_ksp, "collisions",0);nicp->new.nocp = fetch_nocanput(nicp->op_ksp, 0);nicp->new.defer = fetch32(nicp->op_ksp, "defer_xmts",0);nicp->new.sat = nicp->new.defer + nicp->new.nocp +nicp->new.coll;nicp->new.sat += fetch32(nicp->op_ksp, "noxmtbuf", 0);break;}nicp->speed = fetch64(nicp->op_ksp, "ifspeed", 0);nicp->duplex = fetch32(nicp->op_ksp, "link_duplex", 0);}
...
}
static void load_snmp(FILE *snmp)
{
.../* 从/proc/net/snmp加载TCP和/或UDP统计信息 */
...while (remaining) {p = fgets(buf, sizeof (buf), snmp);if (! p)break;if (g_tcp && strncmp("Tcp: RtoAlgorithm RtoMin RtoMax MaxConn ""ActiveOpens PassiveOpens AttemptFails ""EstabResets CurrEstab InSegs OutSegs ""RetransSegs InErrs OutRsts", p, 141) == 0) {int n;n = fscanf(snmp, "Tcp: %lld %lld %lld %lld ""%lld %lld %lld %lld %lld %lld ""%lld %lld %lld %lld\n",&ll[0], &ll[1], &ll[2], &ll[3],&ll[4], &ll[5], &ll[6], &ll[7],&ll[8], &ll[9], &ll[10], &ll[11],&ll[12], &ll[13]);if (n == 14) {g_tcp_new->inDataInorderSegs = ll[9];g_tcp_new->outDataSegs = ll[10];g_tcp_new->estabResets = ll[7];g_tcp_new->outRsts = ll[13];g_tcp_new->attemptFails = ll[6];/* Note: bytes */g_tcp_new->retransBytes = ll[11];g_tcp_new->passiveOpens = ll[5];g_tcp_new->activeOpens = ll[4];}remaining--;} else if (g_udp && strncmp("Udp: InDatagrams NoPorts ""InErrors OutDatagrams RcvbufErrors ""SndbufErrors\n", p, 72) == 0) {int n;n = fscanf(snmp, "Udp: %lld %lld %lld %lld ""%lld %lld\n",&ll[0], &ll[1], &ll[2], &ll[3],&ll[4], &ll[5]);if (n == 6) {g_udp_new->inDatagrams = ll[0];g_udp_new->outDatagrams = ll[3];g_udp_new->inErrors = ll[2]; /* + ll[4]? */g_udp_new->outErrors = ll[5];}remaining--;}}
}
...
static void update_timestr(time_t *tptr)
{
...if (tptr)t = *tptr;elset = time(NULL);tm = localtime(&t);(void) strftime(g_timestr, sizeof (g_timestr), "%H:%M:%S", tm);
}static void sleep_for(hrtime_t period, hrtime_t start_n)
{
...do {pause_tv.tv_sec = pause_n / NANOSEC;pause_tv.tv_nsec = pause_n % NANOSEC;status = nanosleep(&pause_tv, (struct timespec *)NULL);if (status < 0)if (errno == EINTR){now_n = gethrtime();pause_n = start_n + period - now_n;if (pause_n < 100)return;}else {...}} while (status != 0);
}
...
If you need the complete source code, please add the WeChat number (c17865354792)
运行结果:
Time列:表示当前采样的响应时间.
Int: 网卡名称.
rKB/s : 每秒接收到千字节数.
wKB/s : 每秒写的千字节数.
rPk/s : 每秒接收到的数据包数目.
wPk/s : 每秒写的数据包数目.
rAvs : 接收到的数据包平均大小.
wAvs : 传输的数据包平均大小.
%Util : 网卡利用率(百分比).
Sat : 网卡每秒的错误数.网卡是否接近饱满的一个指标.尝试去诊断网络问题的时候,推荐使用-x选项去查看更多的统计信息.
这将显示ens33接口的流量、带宽使用情况以及其他统计数据:
监控所有网络接口的统计信息,同时显示TCP和UDP连接相关的统计信息:
总结
网络流量分析需要一定的技术知识和经验,但通过学习和实践,我们可以掌握这个技能,更好地管理和维护网络环境。
Welcome to follow WeChat official account【程序猿编码】
相关文章:

Linux C/C++ 实现网络流量分析(性能工具)
网络流量分析的原理基于对数据包的捕获、解析和统计分析,通过对网络流量的细致观察和分析,帮助管理员了解和优化网络的性能、提高网络安全性,并快速排查和解决网络故障和问题。 Linux中的网络流量常见类型 在Linux中,网络流量可以…...

python门牌制作,统计某个数字出现的次数
题目: 小蓝要为一条街的住户制作门牌号。 这条街一共有 2022位住户,门牌号从 1 到 2022 编号。 小蓝制作门牌的方法是先制作 0 到 9 这几个数字字符,最后根据需要将字符粘贴到门牌上,例如门牌 1017 需要依次粘贴字符 1、0、1、…...

轻量封装WebGPU渲染系统示例<7>-材质多pass(源码)
当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/version-1.01/src/voxgpu/sample/MultiMaterialPass.ts 此示例渲染系统实现的特性: 1. 用户态与系统态隔离。 2. 高频调用与低频调用隔离。 3. 面向用户的易用性封装。 4. 渲染数据和渲染机制分离。 …...

0030Java程序设计-积分管理系统论文
文章目录 摘 要**目 录**系统实现系统功能需求3.2.1 管理员功能3.2.2 柜员功能 开发环境 摘 要 随着计算机和网络的不断革新,世界已经进入了前所未有的电子时代。作为实用性强、应用范围广泛的会员管理系统也正在被越来越多的各类企业用于消费管理领域。然…...

H5游戏源码分享-考眼力游戏猜猜金币在哪
H5游戏源码分享-考眼力游戏猜猜金币在哪 <!DOCTYPE html> <html> <head><meta http-equiv"Content-Type" content"text/html; charsetUTF-8"><meta charset"UTF-8"><meta name"apple-mobile-web-app-capa…...

2023 年值得关注的国外网络安全初创公司
网络安全初创公司试图解决的问题往往有点超前于主流。他们可以比大多数老牌公司更快地填补空白或新兴需求。初创公司通常可以更快地创新,因为它们不受安装基础的限制。 当然,缺点是初创公司往往缺乏资源和成熟度。公司致力于初创公司的产品或平台是有风…...

搞定蓝牙-第六篇(HID
搞定蓝牙-第六篇(HID) ble与HIDHOGPGAPP与HID ESP32程序分析 ble与HID HOGP 我们发现,电脑连接了蓝牙键盘就可以直接使用了,不需要配置任何东西,那么,这两者是怎么通讯的呢。我们使用的电脑windows系统内…...

Open3D(C++) 最小二乘拟合平面(直接求解法)
目录 一、算法原理二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。 一、算法原理 平面方程的一般表达式为: A x + B y + C...

lua移植及使用
编译环境:Ubuntu16.04 64位 交叉编译工具:arm-hisiv500-linux-gcc 文章目录 1. 项目背景2. lua开源版本选择3. 封装代码3.1 源码简介3.2 封装类3.2.1 头文件3.2.2 类的实现3.3.3 sample代码 1. 项目背景 使用lua脚本,读取key对应的值&#x…...

【鸿蒙软件开发】ArkTS基础组件之Select(下拉菜单)、Slider(滑动条)
文章目录 前言一、Select下拉菜单1.1 子组件1.2 接口参数 1.3 属性1.4 事件1.5 示例代码 二、Slider2.1 子组件2.2 接口参数:SliderStyle枚举说明 2.3 属性2.4 事件SliderChangeMode枚举说明 2.5 示例代码 总结 前言 Select组件:提供下拉选择菜单&#…...

linux ssh 免密登录
概述 在大数据测试环境搭建时,经常会用到 ssh 免密登录 ,方便机器之间分发文件,从一个机器上登录至其它机器也方便 如何配置 linux 的 ssh 免密登录? 非免密登录 端口是22 [rootKS8P-Test-K8S06 ~]# ssh KS8P-Test-K8S06端口非22 [roo…...

秒级启动的集成测试框架
本文介绍了一种秒级启动的集成测试框架,使用该框架可以方便的修改和完善测试用例,使得测试用例成为测试过程的产物。 背景 传统的单元测试,测试的范围往往非常有限,常常覆盖的是一些工具类、静态方法或者较为底层纯粹的类实现&…...

Redux 数据仓库
Redux 数据仓库 解决React 数据管理(状态管理) ,用于中大型,数据比较庞大,组件之间数据交互多的情况下使用。 作者:如果你不知道是否需要使用Redux,那么你就不需要它! 解决组件的数据通信。 …...

[毕设记录]@开题调研:一些产品
我感觉产品能代表落地的一些实际应用,会和研究的角度有些差别,但是需求和兴趣往往是从现实中来的,在上一篇blog里面看外国blog的时候顺着搜搜到了很多国外的智慧校园chatbot解决方案 文章目录 Comm100streebomodern campusUniBuddy Comm100 …...

CSS3中的字体和文本样式
CSS3优化了CSS 2.1的字体和文本属性,同时新增了各种文字特效,使网页文字更具表现力和感染力,丰富了网页设计效果,如自定义字体类型、更多的色彩模式、文本阴影、生态生成内容、各种特殊值、函数等。 1、字体样式 字体样式包括类…...

LVS集群-DR模式【部署高可用LVS-DR集群】
文章目录 2.2 实战:配置LVS-DR集群2.2.1 配置IP(Director Server的部署配置)2.2.2 生成ens33:1配置文件 (Director Server的部署配置)2.2.3 配置LVS-DR规则(Director Server的部署配置)2.2.4 两…...

银河麒麟服务器版v4安装程序缺少依赖包,改为利用手机联网在线安装
1 将安卓手机连接使用usb转typec线连接到服务器的usb口。(linux桌面版)也可以类似的方法手机联网。 2 在手机热点中打开usb共享 3 使用ifconfig命令找到手机被服务器识别成的网卡名 4 使用dhclient “手机网卡名”命令,使服务器能上网。 5 变…...

Maven第一章:Maven安装、验证、使用
Maven第一章:Maven安装、验证、使用 前言 谁适合阅读本教程? Java开发人员:Maven是Java项目管理和构建工具,因此对Java开发人员来说是一个重要的工具。阅读Maven知识可以帮助他们更好地理解如何使用Maven来管理Java项目,包括依赖管理、构建自动化、项目构建和部署等。项目…...

ios 代码上下文截屏之后导致的图片异常问题
业务场景,之前是直接将当前的collectionview截长屏操作,第一次截图会出现黑色部分原因是视图未完全布局,原因是第一次使用了Masonry约束然后再截图的时候进行了frame赋值,可以查看下Masonry约束和frame的冲突,全部修改…...

《嵌入式软\硬件开发难点-2023-10-29》
一、《嵌入式软件开发难点》 内存有限、螺蛳壳里做道肠;处理能力有限,必须做好规划,榨取系统每一份处理能力;现代开发工具和实际工具难实施,资源问题:C/Python/Java;调试跟踪问题较困难&#x…...

基于5G工业CPE打造智慧煤矿无人巡检监测应用
煤炭是我国重要的能源资源,对于煤炭的开采和利用也是我国重要的工业产业部分。得益于5G物联网技术的发展普及,煤矿场景也迎来智能化升级,实现了包括智能采掘、智能调度、无人运输、无人巡检等新型应用,极大提升了煤矿采运产业的效…...

考点之数据结构
概论 时间复杂度和空间复杂度是计算机科学中用来评估算法性能的重要指标。 时间复杂度: 时间复杂度衡量的是算法运行所需的时间。它表示算法执行所需的基本操作数量随着输入大小的增长而变化的趋势。 求法: 通常通过分析算法中基本操作执行的次数来…...

07、SpringCloud -- jmeter 压测
目录 jmeter 入门jmeter 安装测试步骤测试数据模拟多用户操作1、创建http请求2、添加http cookie 管理器3、并发获取当前登录用户数据的效果4、添加多个用户模拟并发请求5、访问方法6、jmeter添加 CSV Data Set Config7、高并发执行访问的效果8、总结流程高并发秒杀压测jmeter …...

省市区三级联动查询redis(通过python脚本导入数据)
最近工作有一个工作需求是实现省市区联动,点击省下拉框,选中一个省,然后再选市,最后选区,当然最重要的首先自然是数据了,没数据怎么测试接口,我数据是在 https://hxkj.vip/demo/echartsMap/ 这里…...

Linux命令(108)之dirname
linux命令之dirname 1.dirname介绍 linux命令dirname是用来获取文件的指定路径 2.dirname用法 dirname [参数] NAME dirname参数 参数说明-z使用NUL而不是换行符分隔输出--help查看帮助信息--version查看版本信息 3.实例 3.1.获取文件的指定路径 命令: dirn…...

SDL事件处理以及线程使用(2)
事件使用 #include <stdio.h> #include <SDL.h>#define FF_QUIT_EVENT (SDL_USEREVENT 1) // 定义自定义事件#undef main int main() {SDL_Window* pWindow NULL;SDL_Init(SDL_INIT_VIDEO);// 创建窗口pWindow SDL_CreateWindow("Event Test Title&…...

DAY38 动态规划 + 509. 斐波那契数 + 70. 爬楼梯 + 746. 使用最小花费爬楼梯
动态规划理论 动态规划,Dynamic Programming, DP, 如果某一问题有很多重叠子问题,使用动态规划是最有效的。 所以动态规划中每一个状态一定是由上一个状态推导出来的,这一点就区分于贪心,贪心没有状态推导…...

Redis快速上手篇七(集群-一台虚拟机六个节点)
http://t.csdnimg.cn/S0NpK与上篇六个虚拟机配置基本一样有不懂可以看上篇配置实例 集群搭建 根据上篇文章,本篇只着重于小方面的配置差别 配置集群一般不要设置密码 1.搭建一台虚拟机后再安装目录下新建文件夹 redis_cluster 2.在文件夹内创建六个文…...

社恐了怎么办?如何改变社交恐惧症?
社恐这个词已经算是普及了,自嘲自己是社恐的人真的挺多的,好像一句我社恐了就能解析很多问题,其实真正的社恐远比我们想象的要痛苦多了,社恐能被更多人认识到本来是件好事,但是过于的用社恐来给自己贴标签,…...

HiQPdf Library for .NET - HTML to PDF Crack
HiQPdf Library for .NET - HTML 到 PDF 转换器 .NET Core,用于 .NET 的 HiQPdf HTML 到 PDF 转换器 :HiQPdf HTML to PDF Library for .NET C# 和 HTML to PDF .NET Core 为您提供了一个现代、快速、灵活且强大的工具,只需几行代码即可创建复…...