【口袋剑神源码】【crazepony 源码】【sksockserver 源码】ntp 源码

2024-11-19 00:49:45 来源:stm32 bootloader源码 分类:时尚

1.深夜写完的代码——快速实现.NET(.net framework/.net core+)动态访问webservice服务
2.使用openwrt路由(例极路由3(HC5861))过校园网多设备检测(非破解) (宿舍共网)
3.2020-08-25
4.ntpdate失败报错“the NTP socket is in use, exiting”
5.ntpdc命令如何在交互模式下执行对等体列表操作?
6.linux C/C++实现同步NTP时间

ntp 源码

深夜写完的代码——快速实现.NET(.net framework/.net core+)动态访问webservice服务

       访问webservice服务时,通常采用服务引用方式,然而此法较为繁琐,尤其在服务更新时,需要手动更新引用并重新发布,极为不便。口袋剑神源码现今,已有多例展示了在.NET Framework环境中实现动态访问webservice服务,却鲜少见到适用于.NET Core及更高版本的案例。本篇文章旨在提供一个通用解决方案,支持.NET Framework、.NET Core或以上环境的动态访问webservice服务接口,以供参考。

       首先,创建一个webservice服务作为测试平台。该服务提供三种接口:无参数接口、字符串参数接口、包含多个实体类参数(实体类包含嵌套和集合)及返回带有嵌套和集合的返回数据。此设计基本涵盖了webservice服务的主要场景。

       测试实体类已备好,用于验证服务接口。

       服务已启动并就绪。crazepony 源码

       接下来,开发请求端程序,支持.NET Framework 4.6.1+、.NET Core+及.NET 5+所有版本。可以通过NuGet引入Wesky.Net.OpenTools包,确保使用最新版本以获取完善功能。本文以.NET 8控制台为例,使用者可根据需求自行调整引用。

       程序中实例化WebserviceHelper对象,对于使用IOC容器的项目(如asp.net core),可进行依赖注入的注册;对于无需IOC容器的项目,直接new对象即可。获取asmx的url地址,并在结尾添加?wsdl。

       设定要访问的服务名称,例如“HelloWorld”,然后调用接口。无参数情况下,参数设为null。

       运行程序调用接口,获取xml文档返回值。sksockserver 源码

       调用返回类型为OpenToolResult,该类型包含基础类型值解析方法。解析后得到的最终返回消息为“Hello World”。

       基础类型值解析方法定义了获取返回值、节点名称(一般为方法名称+“Result”)及命名空间的过程。命名空间在调用时会被存储在OpenWebserviceInfo的OpenWebservice集合中,通过url地址和接口方法名匹配到对应的命名空间。

       OpenWebserviceDocCache类型定义了存储和管理命名空间的结构。

       接着,尝试传入一个基础类型参数,访问“Hola”方法,传入“Wesky”,成功获取返回值“Wesky World”。

       随后,模拟多个实体类参数的调用,服务应返回一个包含其他实体类的消息。

       回顾TestService服务接口实现,确认动态访问是成功的。

       访问webservice方法定义如下:支持0个或多个参数,参数个数需与解析wsdl地址的方法服务匹配。Result.IsSuccess为true表示请求成功,mtrace 源码解析错误或请求失败时返回false,并附带具体错误描述。

       返回值为实体类时,需要调用ExtractCustomerValueFromXml方法进行解析。以ResultInfo类型为例,此方法可处理返回实体类数据。

       关键代码片段已列出,若本教程对你有所助益,请分享给需要的朋友,并关注公众号:Dotnet Dancer。如有需要,公众号后台回复“动态接口”获取演示代码和webservice测试源码。

       OpenTools系列文章链接如下,新版本与旧版本完全兼容,无需更新任何代码即可使用:

       版本1.0.:如何一行C#代码实现解析类型的Summary注释(适用于数据字典快速生成)

       版本1.0.:C#/.NET一行代码将实体类类型转换为Json数据字符串

       版本1.0.8:上位机与工控必备!用.NET快速搞定Modbus通信的方法

       版本1.0.7:揭秘!.Net如何在5分钟内快速实现物联网扫码器通用扫码功能?

       版本1.0.6:.NET实现获取NTP服务器时间并同步(附带Windows系统启用NTP服务功能)

       版本1.0.5:C#使用P/Invoke实现注册表的增删改查功能

       版本1.0.3:C#实现转Base字符串,以及Base字符串在Markdown文件内的复原演示

       版本1.0.2:C#实现Ping远程主机功能(支持IP和域名)

       版本1.0.1:开始开源项目OpenTools的创作(第一个功能:AES加密解密)

       备注此包版本完全开源,无第三方依赖,适用于.net framework 4.6+、任意其他跨平台.net版本环境。raspbian 源码

使用openwrt路由(例极路由3(HC))过校园网多设备检测(非破解) (宿舍共网)

       校园网多设备检测使用openwrt路由(如极路由3(HC))的步骤和技巧如下:

       首先,你需要了解校园网可能采取的检测策略,包括基于IPv4数据包包头内的TTL字段的检测、基于HTTP数据包请求头内的User-Agent字段的检测(UA2F)、DPI(深度包检测技术)、基于IPv4数据包包头内的Identification字段的检测、基于网络协议栈时钟偏移的检测技术、Flash Cookie检测技术。这些检测方法可能会限制多设备接入。

       针对极路由3(HC),采用Lean大佬的Openwrt源码进行编译,登陆IP为..1.1,密码为"password"。在编译时,确保TurboACC技术关闭,以免影响User-Agent字段,导致问题如微信无法发送。解决方法是执行命令"uci set ua2f.firewall.handle_mmtls=0 && uci commit ua2f"。

       刷入Openwrt后,进行以下配置:

       1. 启用NTP客户端和作为NTP服务器提供服务,填写候选NTP服务器为:ntp1.aliyun.com、time1.cloud.tencent.com、stdtime.gov.hk、pool.ntp.org。

       2. 添加自定义防火墙规则。

       3. 对UA2F进行配置,确保检测正确。

       配置完成后,即可进行多设备检测。确认真实User-Agent显示正确,说明配置成功。一个宿舍内可用一台路由器加一个账号上网。

       感谢Lean提供的Openwrt源码,参考关于某大学校园网共享上网检测机制的研究与解决方案,UA2F技术来自Zxilly/UA2F,修改IPID技术来自CHN-beta/rkp-ipid。祝学子们早日摆脱校园网限制。

--

       Prometheus 实现邮件告警(Prometheus+Alertmanager+QQ邮箱或者网易邮箱,目前测试过这两种邮箱都可以发送告警邮件)

        Prometheus实现邮件告警原理如下:

        Prometheus官方有一个附带的中间件:alertmanager,通过设置rules规则和路由转发可以实现邮件告警,前提是你需要有一个可以发送邮件的邮件服务端(可以自建或者使用互联网公司提供的免费邮箱)

        告警原理图

       Prometheus完整架构图

        我之前得出的错误结论如下:

        推荐直接在虚拟机操作系统上直接安装Prometheus和Alertmanager,不推荐其中任何一方在容器中运行,因为测试过在容器中运行Prometheus和alertmanager,结果出现如下错误情况

        第一种情况是:我的node-exporter掉线跌机了(手动关机,模拟突然掉线跌机),Prometheus却提示节点依然在线?有时候却能够正常显示节点掉线跌机,生成告警发送邮件

        第二种情况是:我的node-exporter掉线跌机了(手动关机,模拟突然掉线跌机),Prometheus提示节点掉线,告警生成,但是没有发送邮件,我手动恢复node-exporter后,告警解除,邮件能正常发送邮件提示告警已经解除。。。。

        第三种情况是:我的node-exporter掉线跌机了(手动关机,模拟突然掉线跌机),Prometheus提示节点掉线,告警生成,正常成功发送邮件,我手动恢复node-exporter后,告警解除,邮件没有发送出来。。。。

        以上三种情况之前经常出现,当时第一步以为是自己设置的scrape_interval不合理导致的,结果调试几次,问题没有解决,第二步以为是自己的服务器时间没有做到精确同步,然后我去设置和阿里云的ntp服务器同步,结果问题依然没有解决,第三步,换个方向,把alertmanager迁移到虚拟机操作系统上安装运行,问题解决!

       åŒ—京时间是GMT+8小时,有些同志的时间可能是UTC的,但是如果是在要求不太十分精确的情况下,UTC时间是刚刚好等于GMT时间

        为了避免时区的混乱,prometheus所有的组件内部都强制使用Unix时间,对外展示使用GMT时间。

        要改时区有两个办法

        1 .修改源码,重新编译。

       2. 使用 docker 运行 Prometheus,挂载本地时区文件

        docker run --restart always -e TZ=Asia/Shanghai --hostname prometheus --name prometheus-server -d -p : -v /data/prometheus/server/data:/prometheus -v /data/prometheus/server/conf/prometheus.yml:/etc/prometheus/prometheus.yml -u root prom/prometheus:v2.5.0

        正文开始

        安装alertmanager

        容器安装方式:

        docker run -d --name alertmanager -p : -v /usr/local/Prometheus/alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml prom/alertmanager:latest

        先在宿主机/usr/local/Prometheus下创建一个文件夹alertmanager,然后在文件夹里创建alertmanager.yml配置文件,待会才能映射到alertmanager容器里的/etc/alertmanager目录下

       global:全局配置

           resolve_timeout: 问题解决的超时时间

           smtp_from: 发送告警邮件的邮箱账号

           smtp_smarthost: é‚®ç®± SMTP 服务地址,这里是以QQ邮箱为例,也可以用网易邮箱,这个和我之前设置zabbix邮件告警时的配置一样

           smtp_auth_username: 如果没有设置邮箱别名,那就是账户名

           smtp_auth_password:  邮箱的授权码,不是 账户密码,你可以在QQ邮箱或者网易邮箱网页端设置,开启 POP3/SMTP æœåŠ¡æ—¶ä¼šæç¤ºï¼Œå’Œé…ç½®zabbix邮件告警的时候几乎一样

           smtp_require_tls: 是否使用 tls,根据环境不同,来选择开启和关闭。如果提示报错 email.loginAuth failed: Must issue a STARTTLS command first,那么就需要设置为 true。着重说明一下,如果开启了 tls,提示报错 starttls failed: x: certificate signed by unknown authority,需要在 email_configs 下配置 insecure_skip_verify: true 来跳过 tls 验证。

       templates: 告警模板目录,可以不编写模板,有默认模板

            Subject: '{ { template "email.default.subject" . }}'

            html: '{ { template "email.default.html" . }}'

       route:报警的分发设置

            group_by:分组

            group_wait: 分组等待时间

            group_interval: 5m 每组时间间隔

            repeat_interval: m 重复间隔

            receiver: 接收方式,请注意!这里的名字要对应下面receivers中的任何一个名字,不然会报错,这里其实就是选择方式,有邮箱,企业微信,wehook,victorops等等

       receivers:接受方式汇总,即告警方式汇总

        例子:

        receivers:

        - name:'default-receiver' 

        email_configs:

        - to:'whiiip@.com'    

          html: '{ { template "alert.html" . }}'    

          headers: { Subject: "[WARN] 报警邮件test"}

       inhibit_rules:   æŠ‘制规则

        当存在与另一组匹配的警报(源)时,抑制规则将禁用与一组匹配的警报(目标)。

        包括源匹配和目标匹配

        alertmanager官方是这样说的

        Inhibition

        Inhibition is a concept of suppressing notifications for certain alerts if certain other alerts are already firing.

        Example:  An alert is firing that informs that an entire cluster is not reachable. Alertmanager can be configured to mute all other alerts concerning this cluster if that particular alert is firing. This prevents notifications for hundreds or thousands of firing alerts that are unrelated to the actual issue.

        Inhibitions are configured through the Alertmanager's configuration file.

        当存在与另一组匹配器匹配的警报(源)时,禁止规则会使与一组匹配器匹配的警报(目标)静音。目标警报和源警报的equal列表中的标签名称都必须具有相同的标签值。

        在语义上,缺少标签和带有空值的标签是同一件事。因此,如果equal源警报和目标警报都缺少列出的所有标签名称,则将应用禁止规则。

        为了防止警报禁止自身,与规则的目标和源端 都 匹配的警报不能被警报(包括其本身)为真来禁止。但是,我们建议选择目标匹配器和源匹配器,以使警报永远不会同时匹配双方。这很容易进行推理,并且不会触发此特殊情况。

        接着是规则rules

       ä¸è§£é‡Šäº†ï¼Œè‡ªå·±ç ”究官方文档

       alertmanager的非容器安装方式是

         wget /prometheus/alertmanager/releases/download/v0..0/alertmanager-0..0.linux-amd.tar.gz

        tar xf alertmanager-0..0.linux-amd.tar.gz

       mv alertmanager-0..0.linux-amd /usr/local/alertmanager

       vim /usr/lib/systemd/system/alertmanager.service

       [Unit]

       Description=alertmanager

        Documentation=/prometheus/alertmanager

        After=network.target

        [Service]

        Type=simple

        User=root

        ExecStart=/usr/local/alertmanager/alertmanager --config.file=/usr/local/alertmanager/alertmanager.yml

        Restart=on-failure

        [Install]

        WantedBy=multi-user.target

        Alertmanager 安装目录下默认有 alertmanager.yml 配置文件,可以创建新的配置文件,在启动时指定即可。

        其余方式和上面一样

        接着是Prometheus,我之前的博客里有写了容器安装和非容器安装的方法,自己去翻阅

        然后是在prometheus.yml里修改相关配置

        首先去掉alertmanager的注释,改成IP加你设置的端口号,默认是

       æŽ¥ç€åœ¨rule_files: 下面写下规则文件的绝对路径,可以是具体文件名,也可以是*,也可以分几级文件,*默认是全部匹配

       æŽ¥ç€æ˜¯è¢«ç›‘控项的设置,这里设置完成可以在Prometheus网页里的targets里看得到

        请注意,这里设置的参数名字要和rule规则中设置的参数名字一模一样,否则你的prometheus服务会无法启动,然后报错

        如果不在特定的job下设置scrape_interval(优先级高于全局),则默认采用gobal下的scrape_interval

       æœ€åŽæ¨¡æ‹ŸèŠ‚点掉线,手动关闭node-exporter或者Cadvisor

        docker stop node-exporter 或者容器ID

        docker stop cadvisor æˆ–者容器ID

        或者把up{ { job='prometheus'}} == 1 设置成1,反向设置,不用关掉服务,就可以看看告警成不成功

       è¯´æ˜Žä¸€ä¸‹ Prometheus Alert 告警状态有三种状态:Inactive、Pending、Firing。

        Inactive:非活动状态,表示正在监控,但是还未有任何警报触发。

        Pending:表示这个警报必须被触发。由于警报可以被分组、压抑/抑制或静默/静音,所以等待验证,一旦所有的验证都通过,则将转到 Firing 状态。

        Firing:将警报发送到 AlertManager,它将按照配置将警报的发送给所有接收者。一旦警报解除,则将状态转到 Inactive,如此循环。

       æ²¡æœ‰é…ç½®å‘Šè­¦æ¨¡æ¿æ—¶çš„默认告警格式是这样的

       èŠ‚点恢复后邮件告知是这样的

       å†™äº†æ¨¡æ¿åŽæ˜¯è¿™æ ·çš„

       è¿˜è¦é‡æ–°æ˜ å°„模板文件夹路径到alertmanager容器里的相对路径,然后重启alertmanager,当然,如果目录下没有模板文件,则不显示

       å‘Šè­¦æ¨¡æ¿

       åœ¨alertmanager.yml中修改相关设置

        重启alertmanager

        docker restart alertmanager

        最终效果不是很好

ntpdate失败报错“the NTP socket is in use, exiting”

       今天,我被老大要求处理产品部署失败的问题。产品是云容器平台,部署中遇到了同步时间的挑战。代码调用ntpdate,但遇到报错“the NTP socket is in use, exiting”。我首先尝试搜索解决方案,发现在停用ntpd服务后问题得以解决。然而,为了解决根本问题,我深入研究了ntpdate的源码。

       通过访问ntpdate的官方网站并查看源码下载地址,我了解到ntpdate的代码实际上在GitHub上。这表明,使用ntpdate时应直接获取其源代码,而非依赖旧版本。

       在源码中,我找到了导致错误的NTP socket使用的端口号是。通过查阅代码,我发现此端口号是硬编码的,这表明作者在设计时可能并未考虑到代码的可维护性。

       为了定位到端口号被占用的进程,我检查了当前服务器上的所有进程。结果发现,进程与ntpd服务相关联,且该进程由父进程1启动。通过进一步的排查,我确定了正是ntpd服务占用了端口号。

       最终,我关闭了ntpd服务,从而解决了ntpdate失败的问题。这个过程虽然解决了当前问题,但更重要的是,它提供了面对类似情况时的思考方式和解决策略。下次遇到类似问题时,我们就可以根据所学方法,快速定位并解决端口占用的问题。

ntpdc命令如何在交互模式下执行对等体列表操作?

       ntpdc 是一个强大的工具,专门用于监控和管理 NTP 服务(ntpd)的状态。它采用源代码中定义的 NTP mode 7 控制消息格式,支持交互式操作和命令行参数输入。通过 ntpdc,用户可以获取丰富的状态和统计信息,包括配置选项,这些选项在 ntpd 启动时以及运行时都能进行设置。

       使用 ntpdc 的基本语法是输入其命令后跟相关参数。以下是几个常见的用法:

       在远程主机执行特定命令:ntpdc -c command

       强制进入交互模式:ntpdc -i

       获取对等体列表,显示为点阵数字格式:ntpdc -n

       查看服务器已知对等体及其状态:ntpdc -p 和 ntpdc -s,后者提供略有不同的输出格式

       通过这些实例,你可以在 Linux 系统中轻松地获取和管理 NTP 服务的相关信息。无论是实时监控还是配置调整,ntpdc 都是 NTP 管理不可或缺的实用程序。

linux C/C++实现同步NTP时间

       在Linux C/C++中,实现同步NTP时间涉及时间类型和相关函数的使用,以及NTP服务器的请求和系统时间的更新。

       首先,理解时间类型至关重要。在程序中,我们通常会遇到本地时间(locale time)、格林威治标准时间(GMT, UTC)和世界标准时间(UTC),这些时间以秒为单位,自年1月1日::起计算。例如,通过time()函数获取的秒,通过ctime()函数可以转换为'Fri Oct :: '这样的格式。

       对于获取时间,Linux提供了多种函数,如UTC用time()、asctime()和gmtime(),而经时区转换后的本地时间则用ctime()和localtime()。进一步理解这些函数的差异和用法,可以参考相关博客。

       实现NTP同步的步骤包括:发送一个NTP请求报文,从选定的NTP服务器,如...(国家授时中心)获取时间。对于系统时间的更新,通常需要root权限,但可以通过设置程序的UID(如使用chmod u+s)来让普通用户也能执行需要root权限的操作,如settimeofday(&tv, NULL)。

       如果你想要深入学习Linux C/C++,可以考虑零声教c/c++项目的白金卡课程,它提供实战项目的指导,帮助你打通c++技术方向,包括5大实战项目,确保简历中的项目丰富。课程包括5天答疑服务和学习周期内全额退款保障,报名后可获取源码和其他学习资料。

本文地址:http://8o.net.cn/news/88a151498397.html 欢迎转发