【web server】项目中的一些小点

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 【web server】项目中的一些小点

本篇记录项目中的一些小点,比如支持读取配置文件,命令行读取参数等。

读取配置文件

程序运行中用到的一些参数,首先会读取配置文件中的配置,若在程序运行时指定了参数,按指定的参数运行,首先来看读取配置文件:

配置文件是server.conf文件,配置项按照key:value的方式书写,比如:

PORT:8080
THREADNUM:8

端口号为8080,线程数为8。

来看一下读取配置文件的类Config中的关键代码:

void Config::readConfigFile()
{
    char *pLine = nullptr;
    size_t len = 0;
    ssize_t nread;
    while ((nread = getline(&pLine, &len, m_pFp)) != -1) {
        //移除多余的空格等符号
        char *p = strchr(pLine, ':');
        if (p == nullptr) return;
        char *pValue = removeSpace(p, strlen(p));
        char *pKey = removeSpace(pLine, strlen(pLine) - strlen(p) - 1);
        printf("%s, %s", pKey, pValue);
        m_mapKeyValue.insert(std::make_pair(pKey, pValue));
    }
}

按行读取配置文件,以:分割键值,去除两边多余的空格,保存到一个map成员变量m_mapKeyValue中,这样获取配置的时候直接从内存中取即可,不用重复读取文件。

命令行参数

程序支持命令行读取参数,比如

./server -d -p 8080  //-d表示以守护进程方式运行,-p表示执行端口号

主要是通过getopt调用:

int opt = 0;
    while ((opt = getopt(argc, argv, "dp:")) != -1) {
        switch (opt) {
            case 'd':
                //守护进程
                {
                    pid_t pid;
                    if (fork() < 0) {
                        perror("fork()");
                    } else if (fork() > 0) {
                        exit(0);
                    }
                    //子进程
                    setsid();
                    close(1);
                }
                break;
            case 'p':
                //端口号
                iPort = atoi(optarg);
                break;
            default:
                fprintf(stderr, "Usage: %s [-d] [-p port]\n", argv[0]);
                exit(-1);
        }
    }

调试宏

在调试程序时,除了可以查看日志的输出,还可以定义一个这样的宏:

#ifdef DEBUG 
#define DBG(format, args...) {\
  printf(format, ##args);\
}
#else
#define DBG(format, ...)
#endif

当我们需要输出Debug信息时,在gcc编译时通过-D选项定义一个DEBUG宏即可。比如:

gcc test.cpp -DDEBUG

这样运行后便可以看到一些输出信息,方便调试。

构建脚本

项目采用cmake构建,执行cmake后往往还需要执行make构建,因此我们可以将这些操作放在一个脚本中做,比如build.sh

#!/bin/bash
mkdir build
cd build
cmake ../
make

这样执行一个build.sh即可。

日志文件输出

server运行产生的日志文件,以当前日期命名(比如2022_05_13_log),并输出在当前目录:

char log_full_name[256] = {0};
getcwd(log_full_name, 256);
snprintf(log_full_name, 255, "%s%d_%02d_%02d_%s", log_full_name, my_tm.tm_year + 1900, my_tm.tm_mon +1, my_tm.tm_mday, FILE_TAIL);

还有一个小技巧,在运行server时实时查看日志文件。可以通过tail -f 2022_05_13_log查看日志文件,有日志写入时都能实时看到。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
7天前
|
JavaScript 前端开发 数据安全/隐私保护
Web开发者必看:手把手教你如何轻松播放m3u8流地址,解锁视频播放新技能,让你的项目更上一层楼!
【10月更文挑战第23天】随着互联网技术的发展,m3u8格式因良好的兼容性和高压缩率被广泛用于网络流媒体传输。本文介绍如何在Web端播放m3u8流地址,包括引入视频播放器(如Video.js)、创建播放器容器、初始化播放器及播放m3u8流的具体步骤。此外,还涉及处理加密m3u8流的示例。
14 1
|
15天前
|
JSON 搜索推荐 API
Python的web框架有哪些?小项目比较推荐哪个?
【10月更文挑战第15天】Python的web框架有哪些?小项目比较推荐哪个?
37 1
|
30天前
|
前端开发 JavaScript API
惊呆了!学会AJAX与Fetch API,你的Python Web项目瞬间高大上!
在Web开发领域,AJAX与Fetch API是提升交互体验的关键技术。AJAX(Asynchronous JavaScript and XML)作为异步通信的先驱,通过XMLHttpRequest对象实现了局部页面更新,提升了应用流畅度。Fetch API则以更现代、简洁的方式处理HTTP请求,基于Promises提供了丰富的功能。当与Python Web框架(如Django、Flask)结合时,这两者能显著增强应用的响应速度和用户体验,使项目更加高效、高大上。
47 2
|
2月前
|
前端开发 Python
前后端分离的进化:Python Web项目中的WebSocket实时通信解决方案
在现代Web开发领域,前后端分离已成为一种主流架构模式,它促进了开发效率、提升了应用的可维护性和可扩展性。随着实时数据交互需求的日益增长,WebSocket作为一种在单个长连接上进行全双工通讯的协议,成为了实现前后端实时通信的理想选择。在Python Web项目中,结合Flask框架与Flask-SocketIO库,我们可以轻松实现WebSocket的实时通信功能。
53 2
|
22天前
|
监控 Java Maven
springboot学习二:springboot 初创建 web 项目、修改banner、热部署插件、切换运行环境、springboot参数配置,打包项目并测试成功
这篇文章介绍了如何快速创建Spring Boot项目,包括项目的初始化、结构、打包部署、修改启动Banner、热部署、环境切换和参数配置等基础操作。
89 0
|
22天前
|
网络协议 Windows
Windows Server 2019 Web服务器搭建
Windows Server 2019 Web服务器搭建
|
3月前
|
测试技术 开发者 Python
FastAPI的神奇之处:如何用Python引领Web开发的新浪潮,让你的项目一鸣惊人?
【8月更文挑战第31天】在现代软件开发中,Web应用至关重要,而FastAPI作为高性能Python Web框架,凭借简洁的语法与高效的开发体验,备受开发者青睐。本文将介绍FastAPI的基础概念、使用方法及最佳实践,涵盖路由、模板、请求对象等核心概念,并探讨其优势与社区扩展,助您高效构建Web应用。
92 1
|
3月前
|
存储 JSON 数据安全/隐私保护
"FastAPI身份验证与授权的奥秘:如何用Python打造坚不可摧的Web应用,让你的项目一鸣惊人?"
【8月更文挑战第31天】在现代Web开发中,保证应用安全性至关重要,FastAPI作为高性能Python框架,提供了多种身份验证与授权方式,包括HTTP基础认证、OAuth2及JWT。本文将对比这些机制并附上示例代码,展示如何使用HTTP基础认证、OAuth2协议以及JWT进行用户身份验证,确保只有合法用户才能访问受保护资源。通过具体示例,读者可以了解如何在FastAPI项目中实施这些安全措施。
124 1
|
3月前
|
开发者 Java 安全
Struts 2 实战秘籍:Action 驱动业务,配置文件成就高效开发!
【8月更文挑战第31天】Struts 2 框架作为 Apache 软件基金会的顶级项目,广泛应用于企业级 Web 应用开发。其核心组件 Action 类处理用户请求,而配置文件定义请求与 Action 类间的映射关系。掌握 Action 组件的最佳实践包括继承 `ActionSupport` 类、实现 `execute` 方法及使用类型安全的方法;配置文件的最佳实践则涉及组织 Action 到包中、定义全局结果及使用通配符映射。遵循这些最佳实践,可构建高效、可维护的 Web 应用程序。
39 0
|
3月前
|
Java 数据库连接 Spring
Struts 2 插件开发竟如魔法盛宴,为框架注入超能力,开启奇幻编程之旅!
【8月更文挑战第31天】在Web开发中,Struts 2插件开发允许我们在不改动框架核心代码的前提下,通过创建实现特定接口的Java类来扩展框架功能、调整其行为或促进与其他框架(如Spring、Hibernate)的集成,从而更好地满足特定业务需求。遵循良好的设计原则与实践,能够确保插件的高效稳定运行并提升整体项目的可维护性。具体步骤包括创建项目、定义插件类、实现初始化与销毁逻辑,并将插件部署至应用中。
55 0