热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C++服务器(三):多平台的构思与Windows下的tcp_socket

在做这个服务器的时候,遇到很多奇葩的问题。以前做项目都是使用强大的VS,这次使用G++编译器,配合makefile命令使用,算是了解了控制台下的

在做这个服务器的时候,遇到很多奇葩的问题。
以前做项目都是使用强大的VS,这次使用 G++编译器,配合 makefile 命令使用,算是了解了控制台下的项目是怎么做的了。

若干话题

  • 日志的IO
  • 在main 前自动执行一段代码

多平台

要解决多平台的问题,那么应该要有一个统一的接口,然后再分别实现。
在一个配置文件中,定义宏如下:

#ifndef CPPSERVER
#define CPPSERVER


//基本的配置文件
#define WINDOWS10
//#define LINUX


#ifdef WINDOWS10
#include"windows/Windows.h"
#endif

#ifdef LINUX
#include"linux/Linux.h"
#endif


#endif

然后就可以在不同的目录下完成不同平台的编写。当然,在统一接口名的时候,要小心一点,保证两者的一致性。

socket

对于socket 的编程而言,在Windows 和Linux 下是不一样的,所以这里分开实现了。
对于socket 的声明如下:

class Socket
{
public:
Socket() {}
virtual ~Socket() {}
virtual void close() = 0;
virtual void accept(Socket*)=0;
virtual bool connect() = 0;
virtual int send(const char*, unsigned int , int = 0) = 0;
virtual int recv(char*, unsigned int , int = 0) = 0;

};

当然,这只是一个很初级的版本。不过代码放在github上,可以在那里获得最新版。

各种小问题

makefile

makefile 命令的编写真是折腾了快一个小时。
先放一下现在的命令,以便以后查看。

objects =  base.o Windows.o WindowsSocket.o cppserver.o
cppserver: $(objects)
g++ $(objects) -lWS2_32 -o cppserver
base.o: base.h base.cpp
g++ -c base.cpp -std=c++11
Windows.o: windows/Windows.h windows/Windows.cpp
g++ -c windows/Windows.cpp -std=c++11
WindowsSocket.o:socket/socket.h windows/WindowsSocket.h windows/WindowsSocket.cpp
g++ -c windows/WindowsSocket.cpp -std=c++11 -lWS2_32
cppserver.o: cppserver.cpp cppserver.h base.h
g++ -c cppserver.cpp -std=c++11 -lWS2_32

ttest: test.cpp
g++ test.cpp base.cpp windows/WindowsSocket.cpp -std=c++11 -lWS2_32 -o ttest
clean:
erase *.o

*vs code 不能用来编写makefile ,因为它用四个空格替换了 tab。然而makefile 以tab 作为分类器的标准。

全局变量:全局变量的声明应该尽量添加 extern 关键字。因为当使用make 命令后,最后是多个目标文件合成一个可执行文件,那么,可能会出现全局变量重复定义的问题。

声明写在.h 文件中,定义写在 .cpp 中:前辈们的话是有道理的。当定义也写在头文件中时,一个很头疼的问题就是头文件的重复包含,你必须小心地使用前向声明或者增加多个头文件来解除依赖。
然而,如果分开声明和定义的话,就可以很好地避免这个问题。另外一个值得这么做的原因是,避免函数的重复定义,理由见上。

我的github

xiaosa233


推荐阅读
  • 【并发编程】全面解析 Java 内存模型,一篇文章带你彻底掌握
    本文深入解析了 Java 内存模型(JMM),从基础概念到高级特性进行全面讲解,帮助读者彻底掌握 JMM 的核心原理和应用技巧。通过详细分析内存可见性、原子性和有序性等问题,结合实际代码示例,使开发者能够更好地理解和优化多线程并发程序。 ... [详细]
  • Python与R语言在功能和应用场景上各有优势。尽管R语言在统计分析和数据可视化方面具有更强的专业性,但Python作为一种通用编程语言,适用于更广泛的领域,包括Web开发、自动化脚本和机器学习等。对于初学者而言,Python的学习曲线更为平缓,上手更加容易。此外,Python拥有庞大的社区支持和丰富的第三方库,使其在实际应用中更具灵活性和扩展性。 ... [详细]
  • 本文作为“实现简易版Spring系列”的第五篇,继前文深入探讨了Spring框架的核心技术之一——控制反转(IoC)之后,将重点转向另一个关键技术——面向切面编程(AOP)。对于使用Spring框架进行开发的开发者来说,AOP是一个不可或缺的概念。了解AOP的背景及其基本原理,对于掌握这一技术至关重要。本文将通过具体示例,详细解析AOP的实现机制,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 结语 | 《探索二进制世界:软件安全与逆向分析》读书笔记:深入理解二进制代码的逆向工程方法
    结语 | 《探索二进制世界:软件安全与逆向分析》读书笔记:深入理解二进制代码的逆向工程方法 ... [详细]
  • openGauss行存储核心架构及其页面组织详解
    行存储的核心架构和页面组织是实现DML操作、可见性判断及多种管理功能的基础。作为基于磁盘的存储引擎,行存储在设计上采用了段页式结构,以优化数据的存储和访问效率。这种设计不仅确保了数据的高效存储,还为行存储的各种高级功能提供了坚实的技术支持。 ... [详细]
  • 本文详细解析了 MySQL 5.7.20 版本中二进制日志(binlog)崩溃恢复机制的工作流程。假设使用 InnoDB 存储引擎,并且启用了 `sync_binlog=1` 配置,文章深入探讨了在系统崩溃后如何通过 binlog 进行数据恢复,确保数据的一致性和完整性。 ... [详细]
  • MySQL性能优化与调参指南【数据库管理】
    本文详细探讨了MySQL数据库的性能优化与参数调整技巧,旨在帮助数据库管理员和开发人员提升系统的运行效率。内容涵盖索引优化、查询优化、配置参数调整等方面,结合实际案例进行深入分析,提供实用的操作建议。此外,还介绍了常见的性能监控工具和方法,助力读者全面掌握MySQL性能优化的核心技能。 ... [详细]
  • 本书详细介绍了在最新Linux 4.0内核环境下进行Java与Linux设备驱动开发的全面指南。内容涵盖设备驱动的基本概念、开发环境的搭建、操作系统对设备驱动的影响以及具体开发步骤和技巧。通过丰富的实例和深入的技术解析,帮助读者掌握设备驱动开发的核心技术和最佳实践。 ... [详细]
  • 深入解析 UIImageView 与 UIImage 的关键细节与应用技巧
    本文深入探讨了 UIImageView 和 UIImage 的核心特性及应用技巧。首先,详细介绍了如何在 UIImageView 中实现动画效果,包括创建和配置 UIImageView 实例的具体步骤。此外,还探讨了 UIImage 的加载方式及其对性能的影响,提供了优化图像显示和内存管理的有效方法。通过实例代码和实际应用场景,帮助开发者更好地理解和掌握这两个重要类的使用技巧。 ... [详细]
  • Linux 信号处理全面解析(第六篇)
    本文深入探讨了信号及其来源。信号本质上是对中断机制的软件层面模拟,从原理上看,进程接收到信号与处理器接收到中断请求类似。信号具有异步特性,能够在进程执行过程中随时触发,从而中断当前操作并执行相应的处理程序。文章详细分析了信号的生成、传递和处理机制,并讨论了常见的信号类型及其应用场景。此外,还介绍了如何在 Linux 系统中使用信号进行进程间通信和错误处理,为开发者提供了实用的技术指导。 ... [详细]
  • 在CentOS上部署和配置FreeSWITCH
    在CentOS系统上部署和配置FreeSWITCH的过程涉及多个步骤。本文详细介绍了从源代码安装FreeSWITCH的方法,包括必要的依赖项安装、编译和配置过程。此外,还提供了常见的配置选项和故障排除技巧,帮助用户顺利完成部署并确保系统的稳定运行。 ... [详细]
  • HBase在金融大数据迁移中的应用与挑战
    随着最后一台设备的下线,标志着超过10PB的HBase数据迁移项目顺利完成。目前,新的集群已在新机房稳定运行超过两个月,监控数据显示,新集群的查询响应时间显著降低,系统稳定性大幅提升。此外,数据消费的波动也变得更加平滑,整体性能得到了显著优化。 ... [详细]
  • Spring框架入门指南:专为新手打造的详细学习笔记
    Spring框架是Java Web开发中广泛应用的轻量级应用框架,以其卓越的功能和出色的性能赢得了广大开发者的青睐。本文为初学者提供了详尽的学习指南,涵盖基础概念、核心组件及实际应用案例,帮助新手快速掌握Spring框架的核心技术与实践技巧。 ... [详细]
  • 在稀疏直接法视觉里程计中,通过优化特征点并采用基于光度误差最小化的灰度图像线性插值技术,提高了定位精度。该方法通过对空间点的非齐次和齐次表示进行处理,利用RGB-D传感器获取的3D坐标信息,在两帧图像之间实现精确匹配,有效减少了光度误差,提升了系统的鲁棒性和稳定性。 ... [详细]
  • 题目描述:小K不幸被LL邪教洗脑,洗脑程度之深使他决定彻底脱离这个邪教。在最终离开前,他计划再进行一次亚瑟王游戏。作为最后一战,他希望这次游戏能够尽善尽美。众所周知,亚瑟王游戏的结果很大程度上取决于运气,但通过合理的策略和算法优化,可以提高获胜的概率。本文将详细解析洛谷P3239 [HNOI2015] 亚瑟王问题,并提供具体的算法实现方法,帮助读者更好地理解和应用相关技术。 ... [详细]
author-avatar
手机用户2602931923_450
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有