逐步实现TCP服务端Step04-1:改造

目前的这版程序不支持多客户并发,并非由于结构的局限性导致的无法实现。而是由于在早期不想引入不相关的复杂度而故意没去做这部分内容。

现在进行改造。主要修改netio,将监听socket置为非阻塞,让accept也参与到主循环中来。另外,还需要一个容器来存放那些已被accept了的新socket 。

这个容器要能方便地删除元素(客户离线),同时支持随机访问。基于数组存储的链式结构可以满足需求。

基于C++模板实现了一个不关注元素具体类型的List类 ...


C/C++单出口函数的写法

如果一个函数有多个出口(return),在函数内进行加解锁操作就会比较繁琐。万一在某个出口处忘记解锁,就为死锁做了准备。

为避免此类问题,最好让函数只有单一的出口:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
int Example()
{
    int cond = 0;

    ... ...

    if (1 == cond) {
        return ERR_1;
    }

    ... ...

    if (2 == cond) {
        return ERR_2;
    }

    ... ...

    if (3 == cond) {
        return ERR_3;
    }

    ... ...

    return SUCCESS;
}

第一种写法 ...


基于对象与面向对象

基于对象(Object-Based):以对象作为基本单位,但对象之间并不会发生关系。一个基于对象构建的系统就像是一系列孤立对象的集合体 ...


逐步实现TCP服务端Step03-15:小结

这是一个里程碑,到目前为止,基本的构件都已实现,为下一步的扩展打下了基础。

所谓的“扩展”是指把对单个客户的服务扩展为对n个客户,目前这个版本只针对一个客户。

再明确一下目标,我们要实现的是一个暂时不关注具体业务的基于TCP连接的后端系统。所谓的“不关注具体业务”,就是说要做的“抽象”一些。它更像是一个骨架,如果需要的话,可以把具体的业务逻辑填充进去 ...


逐步实现TCP服务端Step03-14:整理s的主逻辑

主逻辑是指main函数中的大流程。经过一系列变化,目前的s已变得比较臃肿,散落的变量和全局函数使代码变得不易维护,需要对主逻辑进行整理。

定义Control类来整合主流程用到的函数和变量:

这个地方没什么好说的,就是把现有的那些函数和变量都放到Control中 ...


逐步实现TCP服务端Step03-13:消息队列相关

消息队列就是存放消息的队列,而消息的表现形式为“对象”,也就是说这个队列实际上是消息对象队列。

我们希望队列能更通用一些,不仅可以存放消息对象,也可以存放X对象,Y对象和Z对象。Object是它们的一般情况。

对象与一般的内置类型不同 ...