2 增加监听端口

首先,基于CServiceBase类,派生一个CNetService类

CNetService新增了一个成员变量,用于保存监听端口;增加了一个CreateUser方法,用于业务层创建对应的连接对象,其参数为nOrigin,即来源编号,由业务层约定。

NetService在重写基类函数OnStart时,启动一个服务线程,处理服务的监听事件。

#pragma once
#include "ServiceBase.h"

class CLinkUser;

class CNetService :
    public CServiceBase
{
public:
    CNetService();
    virtual ~CNetService();

public:
	virtual void ServerListenThread();
    virtual void OnStart();

public:
    virtual CLinkUser* CreateUser(int nOrigin);

protected:
    int m_nPort;
};

在ServerListenThread函数中,我们使用了Asio的封装类AsioServer,io_context作为参数,传入到CAsioServer的构造函数,后面执行io_context.run(),启动了服务监听。

下面我们看,AsioServer的实现

AsioServer对Asio模块做了简单封装,成员变量m_acceptor在构造函数中接收了传入参数io_context和端口号,服务启动后会监听这个端口号。

svr在构造函数里注册了OnAccept函数,当客户端与服务的TCP连接建立完成后,会触发这个函数,执行acceptor的异步接入,同时启动新的OnAccept函数,等待下一个客户端接入。

此时在m_acceptor.async_accept注册的回调函数中,我们可以建立一个TCPSession,用于管理这个用户和服务端的交互信息。

完善此处的处理逻辑

TCPSession需要在接收客户端消息后,才知道消息发送者的身份,所以,需要将创建LinkUser的函数传递到TCPSession内部,在内部接收到消息后,创建对应的LinkUser。

同样AsioServer本身也不复杂创建,需要由NetService将函数传递进来,因此AsioServer需要增加相应变量和逻辑,完整的AsioServer.h为

NetService在创建Svr时传入

至此,服务框架具有了监听端口的能力,接收客户端的TCP连接请求,并创建相应的会话,在下一节中,我们仔细观察TCPSession所做的处理。

Last updated