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

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;
    //网络模块
    //智能指针创建UdpServer
    std::unique_ptr<UdpServer> usvr = std::make_unique<UdpServer>( port,
             std::bind(&Dict::TranSlate,&dict,std::placeholders::_1) );

    //启动UdpServer
    void Stat()
    {
        _running = true;
        //服务器一般都是死循环
        while(true)
        {
            sockaddr_in peer;
            //recvfrom的最后一个参数类型是socklen_t
            socklen_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.kler.cn/a/449300.html

相关文章:

  • 《智启新材:人工智能重塑分子结构设计蓝图》
  • OpenResty开发环境搭建
  • 掌握命令行参数的艺术:Python的`argparse`库
  • 亚远景-SO 21434标准下的汽车网络安全:风险评估与管理的关键实践
  • 【IMU:视觉惯性SLAM系统】
  • 电脑开机提示error loading operating system怎么修复?
  • 阿里云技术公开课直播预告:基于阿里云 Elasticsearch 构建 AI 搜索和可观测 Chatbot
  • python学习——洛谷 [NOIP1998 提高组] 拼数 两种方法
  • 盒子模型(内边距的设置)
  • 计算机组成原理的学习笔记(6)-- 存储器·其一 SRAM/DRAM/ROM/主存储器的初步认识
  • 学习threejs,scene.overrideMaterial全局材质效果
  • pycharm无法识别conda环境(已解决)
  • Jmeter对图片验证码的处理【超详细】
  • Html:点击图标链接发起QQ临时会话
  • 【LeetCode每日一题】——415.字符串相加
  • 【C++——迭代器】
  • 安科瑞能源物联网平台在老旧小区用电安全改造中的应用与优势
  • HTML+CSS+JS制作汽车网站(内附源码,含5个页面)
  • LLM与金融
  • Python绘制图表
  • SpringBoot3-第一篇(快速入门)
  • Source Insight 导入代码库 观察linux源码
  • canvas绘制仪表盘刻度盘
  • WorkManager
  • Centos8安装源出错 设置基础软件仓库出错(已解决-秒解)
  • ubuntu 安装docker