逐步实现TCP服务端Step05-2:查询数据库

这是一个服务间协作的实例,client向mainsvrd请求服务,mainsvrd根据需要向dbsvrd发起查询请求,dbsvrd查询MySQL数据库,将结果返回给mainsvrd。最后,mainsvrd完成相关业务,将结果返回给客户。

proxy的具体实现,见antframe中的proxy工程。proxy的作用是将消息转发给指定实体。每个实体由类型和ID来标识,proxy必须要掌握所有连入自己的实体的基本信息,如:实体类型,ID,IP等等。这些信息可以在连接建立后,由实体告知proxy,这就意味着proxy要完全依赖于各实体。为保险起见,在配置文件中给出各实体的基本信息,以此信息为准 ...


逐步实现TCP服务端Step04-10:小结

整个Step04阶段所做的工作是让后台系统能支持多客户并发。我们的基本设定是,负责网络通信的netio进程,以及负责业务处理的s进程都是单线程结构。要在这个大前提下对系统进行改造。

首先,不论何种结构,总要对多个客户的信息进行维护。对于netio来说,就是围绕socket的一些数据。我们设定了SocketInfo结构去整合它们,每个客户对应一个SocketInfo结构,用一个list去管理。对于s来说,每一个cilent,就是业务的“用户”,这些用户分别有自己的User对象。我们假设了client的socket值,就是它在业务层面的用户ID,这样,s的每个User对象就有了一个用户ID,基于这个ID可以hash到User对象。同时,User对象中会记录client的SocketInfo结构在list中的索引值,这么一来,就能将netio维护的SocketInfo与s所维护的User对象对应起来。

再说netio对list的处理 ...


逐步实现TCP服务端Step04-9:IOCP

IOCP是Windows平台特有的机制,在Windows平台上,它与epoll在Linux上的地位相当。二者常放在一起讨论,不过,它俩完全不是一类东西。

selectpollepoll系列,属于I/O多路复用机制。通过这种机制,就可在单一流程(单线程)中一次性找出,当前I/O已就绪的文件描述符。这大大降低了,程序因不知道哪些I/O已就绪,而无休止地轮询(调用recv/send等)所有文件描述符所产生的大量无用功。当然,多路复用是用在单线程处理多路I/O的场景中,若一路I/O独占一个线程的话,就没必要轮询了,线程直接阻塞在I/O上就行了。

IOCP是配合Overlapped I/O来使用的,这种所谓的重叠I/O是Windows平台上的异步I/O机制。说到同步、异步的概念,在不同场合下有不同解释。单说异步I/O的话 ...


逐步实现TCP服务端Step02-5:是否需要同步?

两个线程协作基于“单入单出循环队列”,即:只有一个线程向队列里写数据,只有一个线程从队列里拿数据。communicator将“产品”放入g_c2s_code_queue队列,processor从该队列中取“产品”;processor将“产品”放入g_s2c_code_queue队列,communicator从中取“产品”。

负责生产的线程会向队尾写数据,然后写end变量(队尾索引);负责消费的线程只会去写begin变量(队首索引)。也就是说虽然队列是共享的,但是两个线程并没有对同一块内存施加写操作。就这一点来看是安全的 ...


逐步实现TCP服务端Step02-4:两个线程协作

communicator的工作在主线程中进行,再创建一个线程进行process。这个用于process的线程叫“工作线程”。

把主线程中的GetOneMessage和ProcessOneMessage摘出去,至少需要增加如下内容:

  • g_c2s_code_queue - “头”在process侧的code队列
  • g_s2c_code_queue - “头”在communicator侧的code队列
  • PushCodeBack - 入队一个code
  • PopCodeFront - 出队一个code
  • OnRecvdSocketBytes - 处理已recv到的字节,将code入队,如果足够一个code的话 ...


逐步实现TCP服务端:index