当前位置: 首页 > article >正文

Linux网络编程:UDP 的DictServer

1、数据字典字典那我们是不是需要一个txt文件里面包含了我们用来测试字典的数据我们创建一个data.txt文件从中添加一系列格式为英文中文的测试用例随便写几个测试用例就行了。2、字典类与头文件我们先写出一个字典类把这个类定义到我们的字典头文件中去。随后用两个全局变量来记录data.txt文件的路径与文件名。因为我们要使用字典必然会读取文件里面的数据这里就涉及到了文件操作。一个字典的功能必须要有初始化与翻译所以我们可以先把这两个接口给定义一下代码语言javascriptAI代码解释#pragma once #ifndef __DICTIONARY_HPP__ #define __DICTIONARY_HPP__ #include unordered_map #include string const std::string dataname data.txt; // 定义好我们存储字典数据的文件名 const std::string path ./; // 定义好我们存储字典数据的路径 class dictionary { public: dictionary() { } ~dictionary() {} bool LoadDictionary() // 我们需要一个函数来加载字典数据初始化我们的字典对象填充字典数据到哈希表里 { } std::string Translate(const std::string word) // 我们之后用这个函数来实现一个翻译的功能 { } private: std::unordered_mapstd::string, std::string dict; }; #endif我们还可以给我们的类增加一下路径和名字成员变量方便记录管理与使用。代码语言javascriptAI代码解释std::string _filename; std::string _path;// 我们可以把文件名和路径都存储在字典对象里在构造一个字典对象时就在构造函数中通过确实的上面的全局变量值对我们成员变量进行初始化代码语言javascriptAI代码解释dictionary(const std::string filenamedataname,std::string pathdefaultpath) :_filename(filename), _path(path) { }接下来我们来实现一下加载字典的操作。读取一个txt的数据必然要涉及到文件操作。我们这里使用C的文件操作流。所以可以在LoadDictionary中先新建一个输入流但是这里打开文件涉及到这个文件的路径所以我们就需要先合成一下这个文件的路径信息随后进行ifstream的创建。如果打开失败就打印错误提示信息代码语言javascriptAI代码解释std::string filepath_path_filename; // 拼接文件路径和文件名 std::ifstream fd(filepath.c_str()); // 打开文件,默认以读取方式打开 if(!fd.is_open()) { LOG(LogLevel::ERROR)Failed to open dictionary file: filepath; return false; // 如果文件打开失败返回false }如果打开成功我们就需要读取数据了。怎么读取呢我们通过getline读取到一行string格式为apple: 苹果。我们这里使用哈希表存储这个格式怎么可以存储呢所以我们需要对其进行切割如何切割我们定义一个切割接口并传入以下函数参数string类型的line值string*的word与value值用来接收被分割后的字符串这两个都是输出型参数。最后一个sep表示用什么来切割。代码语言javascriptAI代码解释bool Split(std::string line,std::string *word,std::string *value,const std::string sep) { int pos line.find(sep);// 找到的位置 if(posstd::string::npos)//没找到 { return false; } *wordline.substr(0,pos);//pos找到之后所指向的位置就是:的位置substr是一个左闭右开区间 *value line.substr(possep.size());// 从possep.size()开始截取直到字符串结束 if(value-empty()||word-empty()) { return false; // 如果截取的值为空返回false } return true; }完成切割后就把该对pair加入到我们的字典中去代码语言javascriptAI代码解释bool LoadDictionary() // 我们需要一个函数来加载字典数据初始化我们的字典对象填充字典数据到哈希表里 { std::string filepath_path_filename; // 拼接文件路径和文件名 std::ifstream fd(filepath.c_str()); // 打开文件,默认以读取方式打开 if(!fd.is_open()) { LOG(LogLevel::ERROR)Failed to open dictionary file: filepath; return false; // 如果文件打开失败返回false } std::string line; while(getline(fd,line)) { std::string word,value; if(Split(line,word,value,: )) // 假设我们用:来分隔单词和释义 { dict[word]value; // 将单词和释义存入哈希表 } } }那么接下来就是完成我们的翻译工作了。首先这个翻译功能我们想要实现的效果就是传递一个word值调用这个接口进行翻译。我们在翻译里面查找哈希表如果找到该word就返回这个word所对应的value代码语言javascriptAI代码解释std::string Translate(const std::string word) // 我们之后用这个函数来实现一个翻译的功能 { auto itdict.find(word); if(it ! dict.end()) // 如果找到了这个单词 { return it-second; // 返回对应的释义 } else { LOG(LogLevel::WARN)Word not found: word; return Not found; // 如果没找到返回一个默认值 } }至此我们的一个字典类就大功告成了代码语言javascriptAI代码解释#pragma once #ifndef __DICTIONARY_HPP__ #define __DICTIONARY_HPP__ #include unordered_map #include string #include iostream #includestdio.h #includelog.hpp using namespace LogModule; const std::string dataname data.txt; // 定义好我们存储字典数据的文件名 const std::string defaultpath ./; // 定义好我们存储字典数据的路径 class dictionary { public: dictionary(const std::string filenamedataname,std::string pathdefaultpath) :_filename(filename), _path(path) { } ~dictionary() {} bool Split(std::string line,std::string *word,std::string *value,const std::string sep) { int pos line.find(sep);// 找到的位置 if(posstd::string::npos)//没找到 { return false; } *wordline.substr(0,pos);//pos找到之后所指向的位置就是:的位置substr是一个左闭右开区间 *value line.substr(possep.size());// 从possep.size()开始截取直到字符串结束 if(value-empty()||word-empty()) { return false; // 如果截取的值为空返回false } return true; } bool LoadDictionary() // 我们需要一个函数来加载字典数据初始化我们的字典对象填充字典数据到哈希表里 { std::string filepath_path_filename; // 拼接文件路径和文件名 std::ifstream fd(filepath.c_str()); // 打开文件,默认以读取方式打开 if(!fd.is_open()) { LOG(LogLevel::ERROR)Failed to open dictionary file: filepath; return false; // 如果文件打开失败返回false } std::string line; while(getline(fd,line)) { std::string word,value; if(Split(line,word,value,: )) // 假设我们用:来分隔单词和释义 { dict[word]value; // 将单词和释义存入哈希表 } } } std::string Translate(const std::string word) // 我们之后用这个函数来实现一个翻译的功能 { auto itdict.find(word); if(it ! dict.end()) // 如果找到了这个单词 { return it-second; // 返回对应的释义 } else { LOG(LogLevel::WARN)Word not found: word; return Not found; // 如果没找到返回一个默认值 } } private: std::unordered_mapstd::string, std::string dict; std::string _filename; std::string _path;// 我们可以把文件名和路径都存储在字典对象里 }; #endif二、使用字典类那我们应该如何使用我们写好的字典类呢这里就要修改一下我们的服务端了我们需要修改一下我们服务端启动的参数。比如我们可以先使用智能指针创建一个字典对象随后调用这个对象中的加载数据的函数。数据加载完毕之后我们尝试回调函数的方式将我们的Translate函数通过回调传递进去代码语言javascriptAI代码解释// 创建一个由智能指针所管理的字典对象 std::shared_ptrdictionary dict_ptr std::make_shareddictionary(); dict_ptr-LoadDictionary(); // 加载字典数据 // 我们先创建一个服务器对象并用智能指针管理它 std::unique_ptrUdpServer svr_ptr std::make_uniqueUdpServer(std::string(127.0.0.1), 8080, [dict_ptr](const std::string word) - std::string { return dict_ptr-Translate(word); }); // 回调函数的方式传递我们的翻译函数三、UdpServer.hpp的回调实现那么我们应该如何修改我们的头文件呢首先我们需要将一个lambda表达式传进去帮助这个服务端对象初始化所以我们的服务端的初始化函数就必须新增对应的初始化。由于传进去的是一个返回值是string参数是const string的一个函数类型。我们可以在头文件中使用function帮助我们代码语言javascriptAI代码解释using find_t std::functionstd::string(const std::string );至此我们就能使用find_t类型代替我们传进来的类类型。由于新增了初始化所以我们的的服务端类需要新增一个类成员变量代表着传进来的翻译函数接口并在构造函数中初始化我们这里也给其设置一个缺省函数否则就要改变我们的参数顺序非全缺省缺省需要放在右边这样一来我们的_findword就代表着这个函数。我们在start中会受到客户端的消息我们拿到消息后进入翻译函数并返回翻译信息代码语言javascriptAI代码解释void Start() { is_running true; while (is_running) { char buffer[1024]; struct sockaddr_in peer; // 输出型参数 socklen_t len sizeof(peer); // 也是一个输出型参数 ssize_t n ::recvfrom(_sockfd, buffer, sizeof(buffer), 0, (struct sockaddr *)peer, len); if (n 0) { InetAddr temp(peer); // 通过上面的peer来进行初始化这样以来我们就能获取到相关ip地址与端口并打印 buffer[n] \0; // 确保字符串以null结尾 // LOG(LogLevel::INFO) client ip: temp.GetIp() , port: temp.GetPort() // client say: buffer; std::string echo_str Translate: ; // 我们要给客户端回显一条消息 echo_str _findword(std::string(buffer)); // 调用传入的函数来获取翻译结果 // 发送回显消息 ssize_t m ::sendto(_sockfd, echo_str.c_str(), echo_str.size(), 0, (struct sockaddr *)peer, len); if (m 0) { LOG(LogLevel::ERROR) sendto error: strerror(errno); } } } }这样一来一个简单的字典程序就大功告成了。我们可以运行一下代码总结今天的内容比较简单这是我在为明天的聊天室做一个过渡作用。希望大家那个熟练使用我们这里的回调方法明天会经常用到。

相关文章:

Linux网络编程:UDP 的DictServer

1、数据字典字典,那我们是不是需要一个txt文件里面包含了我们用来测试字典的数据?我们创建一个data.txt文件,从中添加一系列格式为英文:中文的测试用例:随便写几个测试用例就行了。2、字典类与头文件我们先写出一个字典…...

探索MS-DOS源代码中的栈帧布局与函数调用规范:从16位汇编看系统设计

探索MS-DOS源代码中的栈帧布局与函数调用规范:从16位汇编看系统设计 【免费下载链接】MS-DOS MS-DOS 1.25和2.0的原始源代码,供参考使用 项目地址: https://gitcode.com/GitHub_Trending/ms/MS-DOS MS-DOS作为早期个人计算机的标志性操作系统&…...

【Pytorch + SpringBoot + Flask + Vue】基于YOLOv12 火灾烟雾检测系统(源码)

一、项目背景火灾是威胁人民生命财产安全的主要灾害之一,具有突发性强、蔓延速度快、扑救难度大等特点。据应急管理部消防救援局统计,2023年全国共接报火灾89.5万起,直接财产损失达67.5亿元。在各类火灾事故中,因发现不及时、报警…...

程序员如何优化生活习惯避免感冒:生活医学视角下的免疫系统守护指南

程序员如何优化生活习惯避免感冒:生活医学视角下的免疫系统守护指南 专栏链接:匠身颐和 作者:培风图南以星河揽胜 引言:当你的代码在运行,而免疫系统却“宕机”了 凌晨 2:47,你刚修复了一个棘手的分布式事…...

Vue3 新 AI 调试神器(来自 React 生态)!

经常用 AI 写前端的同学,一定都有过这种无力感:你想让 AI 改一个页面元素,却只能说——“右上角那个按钮…”、“中间那个卡片…”但问题是:AI 根本不知道你在说哪个元素。于是你只能截图、标注、翻代码、来回试错,效率…...

Jitsi Meet静态资源优化:CDN配置与缓存策略终极指南

Jitsi Meet静态资源优化:CDN配置与缓存策略终极指南 【免费下载链接】jitsi-meet Jitsi Meet - Secure, Simple and Scalable Video Conferences that you use as a standalone app or embed in your web application. 项目地址: https://gitcode.com/GitHub_Tren…...

Rancher蓝绿部署方案:降低容器应用发布风险的高级策略

Rancher蓝绿部署方案:降低容器应用发布风险的高级策略 【免费下载链接】rancher Complete container management platform 项目地址: https://gitcode.com/GitHub_Trending/ra/rancher Rancher作为企业级Kubernetes管理平台,提供了强大的蓝绿部署…...

从理论到实践:空间光耦合单模光纤的匹配度计算与优化

1. 空间光耦合单模光纤的核心挑战 第一次接触空间光耦合单模光纤时,我被那个复杂的积分公式吓到了——贝塞尔函数、重叠积分、电场分布,这些术语堆在一起简直像天书。但后来发现,工程师真正需要的是能直接指导设计的实用方法。想象你正在设计…...

当社交技能缺乏时,如何运用ADHD运动干预提高专注力?

社交技能缺乏背景下的ADHD运动干预策略 在面对社交技能缺乏的情况下,利用ADHD运动干预是一种有效的策略。通过团体运动,学生不仅能提高身体素质,还能增强与同伴的互动能力。比如,参与集体体育活动时,他们需要协作和交流…...

计算机毕业设计之django停车场管理系统

本系统为用户而设计制作停车场管理系统,旨在实现停车场智能化、现代化管理。本停车场管理自动化系统的开发和研制的最终目的是将停车场的运作模式从手工记录数据转变为网络信息查询管理,从而为现代管理人员的使用提供更多的便利和条件。使停车场管理系统…...

搞技术创作的你,是不是也卡在了“发布”这一步?

昨天在调试一个分布式事务的案例,写了三个小时,自认为逻辑清晰、代码可跑、注释到位。结果点击发布,页面转了几圈,弹出来两个字:审核。然后就是漫长的等待。六小时、八小时、十二小时。文章卡在后台,发布时…...

计算机毕业设计之jsp社区住户交流报修管理系统设计与实现

社区住户交流报修管理系统的目的是让使用者可以更方便的将人、设备和场景更立体的连接在一起。能让用户以更科幻的方式使用产品,体验高科技时代带给人们的方便,同时也能让用户体会到与以往常规产品不同的体验风格。与安卓,iOS相比较起来&…...

HMCL启动器资源包管理完全指南:从入门到精通

HMCL启动器资源包管理完全指南:从入门到精通 【免费下载链接】HMCL huanghongxun/HMCL: 是一个用于 Minecraft 的命令行启动器,可以用于启动和管理 Minecraft 游戏,支持多种 Minecraft 版本和游戏模式,可以用于开发 Minecraft 插件…...

kafka怎么处理消息一致性

在 Kafka 里,“消息一致性”一般分三层看:生产一致性、存储一致性、消费一致性。Kafka 自身默认是“至少一次”,需要配合 幂等生产者 事务 幂等消费者/业务设计 才能做到“业务上看起来恰好一次”。一、生产端:怎么保证“消息一…...

消息队列消息堆积处理

一、先止血:防止继续堆限流或降级生产端网关/业务对产生消息的接口限流非核心异步任务(日志、埋点、统计)先降级或关掉临时扩容消费者快速多开几份同样的消费服务实例适当调大每个实例的消费线程数(注意别把 DB/下游打挂&#xff…...

如何查看ollama中模型的运行情况

文章目录 1️⃣ 查看当前正在运行/加载的模型 (最常用) 2️⃣ 查看所有已下载的本地模型列表 3️⃣ 通过 API 探针获取详细运行时信息 查看特定模型的详细信息 查看所有可用模型(API 版本的 list) 4️⃣ 监控系统级资源消耗 (性能分析) 监控 GPU 使用情况 (NVIDIA) 监控 CPU …...

细说 Kafka Partition 分区

Partition(分区)是 Kafka 的核心角色,对于 Kafka 的存储结构、消息的生产消费方式都至关重要。 掌握好 Partition 就可以更快的理解 Kafka。本文会讲解 Partition 的概念、结构,以及行为方式。 一、Events, Streams, Topics 在…...

Ubuntu 24.04 LTS 上 Ollama 本地大模型优化实践(R730xd 实战)

文章目录 Ubuntu 24.04 LTS 上 Ollama 本地大模型优化实践(R730xd 实战) 一、背景 二、硬件特点分析 CPU 内存 三、核心优化思路 四、模型选择与量化 推荐模型规模 量化策略 五、Modelfile 固化参数(关键) 为什么要用 Modelfile? 正确方式 关键说明 六、CPU 优化 1. 性能模…...

**绿色AI:用Python实现轻量级模型压缩与能耗优化的实践探索**在人工智能快速发展的今天,模型体积

绿色AI:用Python实现轻量级模型压缩与能耗优化的实践探索 在人工智能快速发展的今天,模型体积大、推理耗能高已成为制约其落地的重要瓶颈。尤其在边缘设备和移动场景中,“绿色AI”——即低功耗、高效率的AI部署方式——正逐渐成为开发者关注的…...

Anthropic工程师亲述:打造Claude Code,我学会了“像Agent一样思考”

大家好,今天分享一篇AI圈近期很火的实战干货——来自Anthropic核心工程师Thariq Shihipar(trq212)的深度复盘,主题是《Lessons from Building Claude Code: Seeing like an Agent》(《构建Claude Code的经验&#xff1…...

**标题:发散创新:基于Python的多模态融合实践——从图像到文本的跨域语义对齐**在人工智能快速发展的今天,**

标题:发散创新:基于Python的多模态融合实践——从图像到文本的跨域语义对齐 在人工智能快速发展的今天,多模态融合已成为提升模型理解能力的关键路径之一。不同于单一模态的数据处理方式(如仅用图像或仅用文本)&#x…...

STM32智能灯光控制实战:红外+语音+按键三合一方案(附完整代码)

STM32智能灯光控制实战:红外语音按键三合一方案(附完整代码) 在智能家居领域,灯光控制系统正经历着从单一控制向多模态交互的演进。传统方案往往局限于单一控制方式,而现代用户期望的是能够根据场景自由切换的无缝体验…...

基于爬山搜索法的风力发电MPPT控制Simulink仿真探究

基于爬山搜索法的风力发电MPPT控制Simulink仿真模型,包括定步长与变步长算法,变步长仿真效果更好,发电机采用的是永磁同步发电机,在风速改变情况下,变步长跟踪的速度更快、偏差更小。在风力发电系统中,最大…...

我用 AI 生成测试用例,效率提升 3 倍但发现了这 5 个问题

专栏:《AI 测试实战手册》第 5 篇 作者:一线测试工程师 适合人群:手工测试转型、自动化测试提效、测试人搞副业开篇:真实项目案例 这是我上个月在一个电商项目中的真实经历。 项目背景: 新上线一个会员积分系统需求文档…...

手把手教你用Playwright+TestNG搭建H5巡检系统:从数据库驱动到钉钉告警

构建企业级H5自动化巡检系统:Playwright与TestNG深度整合实战 在移动优先的互联网时代,H5页面已成为企业与用户交互的核心门户。一次意外的白屏或功能异常,可能导致数百万的营收流失和品牌信任危机。本文将带你从零构建一套完整的H5自动化巡检…...

高价加了根24g的内存条,试试qwen 3.5 35b-3b的模型本地部署速度如何。关闭思考模式

1,下载lmstuduio https://lmstudio.ai/ 2, 执行: #先添加执行权限 chmod x LM-Studio-0.4.6-1-x64.AppImage#执行 ./LM-Studio-0.4.6-1-x64.AppImage --no-sandbox 在这个模型库里面搜索qwen3.5-35ba3b,下载那个unsloth的。 关闭思考模式:在…...

2026 九大 AI 毕业论文格式排版工具实测:Paperxie 领衔,精准适配 4000 + 高校模板

paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/aippthttps://www.paperxie.cn/format/typesettinghttps://www.paperxie.cn/format/typesetting 毕业季的收尾阶段,格式排版始终是本科生、研究生跨越毕业门槛的 “关键一关”。从字体行距的精准…...

效率翻倍!统信UOS批量重命名文件的4种玩法,太实用了

原文链接:效率翻倍!统信UOS批量重命名文件的4种玩法,太实用了 在日常办公中,很多人都会遇到这样一个问题: 几十个文件需要统一改名 图片、文档命名混乱 一个一个改名太浪费时间 如果你正在使用统信UOS桌面操作系统…...

小米新模型让社区对 DeepSeek V4 耿耿于怀:但真正的变量,可能根本不在 benchmark 上

小米新模型让社区对 DeepSeek V4 耿耿于怀:但真正的变量,可能根本不在 benchmark 上 最近,Reddit 的 LocalLLaMA 社区里出现了一条很有代表性的讨论帖:“What the hell is Deepseek doing for so long?” 帖子的情绪并不复杂&…...

Qwen3.5-9B可审计部署:模型权重可验证,推理过程可追溯

Qwen3.5-9B可审计部署:模型权重可验证,推理过程可追溯 1. 项目概述 Qwen3.5-9B是通义千问团队推出的新一代多模态大语言模型,基于创新的混合架构设计,在保持高效推理的同时,提供了前所未有的可审计能力。该模型特别适…...