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

在做这个服务器的时候,遇到很多奇葩的问题。
以前做项目都是使用强大的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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值