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

linux socket编程之udp_dict_serve服务端--引入配置文件

注意:本篇博客只是对上一篇博客功能的增加

1.创建配置文件(翻译)

Dict.txt

apple: 苹果
banana: 香蕉
cat: 猫
dog: 狗
book: 书
pen: 笔
happy: 快乐的
sad: 悲伤的
run: 跑
jump: 跳
teacher: 老师
student: 学生
car: 汽车
bus: 公交车
love: 爱
hate: 恨
hello: 你好
goodbye: 再见
summer: 夏天
winter: 冬天

2.定义Dict类

#include<string>
#include<fstream>
#include<unordered_map>
#include"log.hpp"class Dict
{//默认配置文件路径const std::string  default_path = "./Dict.txt";//默认分隔符const std::string sep = ": ";
private://将配置文件的内容加载到_dict中bool Load(){std::ifstream file(_dict_conf_file_path);if(!file.is_open()){LOG(FATAL,"open %s error",_dict_conf_file_path);return false;}//按行读取文件std::string line;while(getline(file,line)){if(line == "") continue;std::string word;size_t pos = line.find(sep);word = line.substr(0,pos);std::string han;han = line.substr(pos+sep.size());//将对应的key value插入到哈希桶中_dict.insert(make_pair(word,han));LOG(DEBUG,"load info %s: %s\n",word,han);}file.close();return true;}
public:Dict(const std::string &path = "./Dict.txt"):_dict_conf_file_path(path){Load();}std::string TranSlate(const std::string &word){auto han = _dict.find(word);if(han == _dict.end()){return "这个单词未找到";}return han->second;}~Dict(){}
private://key value 结构的字典 单词 翻译std::unordered_map<std::string,std::string> _dict;//配置文件的目录std::string _dict_conf_file_path;
};

3.main函数中将翻译模块和网络模块分开

    //翻译模块Dict dict;//网络模块//智能指针创建UdpServerstd::unique_ptr<UdpServer> usvr = std::make_unique<UdpServer>( port,std::bind(&Dict::TranSlate,&dict,std::placeholders::_1) );

    //启动UdpServervoid Stat(){_running = true;//服务器一般都是死循环while(true){sockaddr_in peer;//recvfrom的最后一个参数类型是socklen_tsocklen_t len = sizeof(peer);char buffer[1024];//从接收缓存区中读取数据报int n  = recvfrom(_sockfd,buffer,sizeof(buffer)-1,0,(struct sockaddr*)&peer,&len);//读取到数据才做处理,否则什么都不做if(n > 0){buffer[n] = 0;//打印是哪个客户端发来的消息InetAddr addr(peer);LOG(INFO,"message form[%s:%d]: %s\n",addr.GetIp().c_str(),addr.Get_Port(),buffer);//将翻译发送给对方std::string response = _func(buffer);sendto(_sockfd,response.c_str(),response.size(),0,(sockaddr*)&peer,len);}}_running = false;}

http://www.lryc.cn/news/510895.html

相关文章:

  • selenium学习笔记(二)
  • 宏集eX710物联网工控屏在石油开采机械中的应用与优势
  • linux——vi命令常用操作
  • vscode添加全局宏定义
  • 重装荣耀X14笔记本电脑踩坑记
  • Android `android.graphics.drawable` 包深度解析:架构与设计模式
  • Kotlin语言的软件工程
  • 面试经典 150 题——数组/字符串(一)
  • 使用亚马逊针对 PyTorch 和 MinIO 的 S3 连接器实现可迭代式数据集
  • TestMAX/DFT Compiler:时序单元的类型、连接顺序和后DFT优化
  • CAN201 Introduction to Networking(计算机网络)Pt.3 网络层
  • App Factory:简化和加速私人应用开发
  • PHP语言laravel框架中基于Redis的异步队列使用实践与原理
  • 全面Kafka监控方案:从配置到指标
  • kipotix4靶机实战
  • 我的秋招总结
  • 广义线性模型(GLM)全面解析
  • C++ OCR 文字识别
  • PHP实现登录和注册(附源码)
  • AEO海关认证的注意事项
  • ElasticSearch 分布式部署
  • Vue中动态样式绑定+CSS变量实现切换明暗主题功能——从入门到进阶
  • vue3 video 播放rtmp视频?(360浏览器支持)
  • RK356x bsp 7 - PCF8563 RTC调试记录
  • 定义Shape:打造属于你的独特图形
  • JavaWeb(一) | 基本概念(web服务器、Tomcat、HTTP、Maven)、Servlet 简介
  • python学opencv|读取图像(二十一)使用cv2.circle()绘制圆形进阶
  • CLIP:连接文本与图像, 从自然语言监督中学习可迁移的视觉模型
  • Linux 硬盘扩容 分区 挂载
  • 基于 Slf4j 和 AOP 的自动化方法执行时间日志记录方案