ascs 简明开发教程(二):稍加深入

31 篇文章 1 订阅
31 篇文章 0 订阅

QQ交流群:198941541

接前一篇:ascs 简明开发教程(1)

那么ascs在后面做了什么,让这个cs程序能快速的搭建起来呢?

首先看server的定义:

typedef ascs::tcp::server_socket_base<ASCS_DEFAULT_PACKER, ASCS_DEFAULT_UNPACKER> server_socket;
typedef ascs::tcp::server_base<server_socket> server;

可以看出来,server是一个server_base(真正的ascs类),它将提供端口监听、连接接受、对象(server_socket)管理(分配,释放/重用,查找等),它用server_socket来代表一条连接。

同时,server_socket是一个server_socket_base(真正的ascs类),它采用ASCS_DEFAULT_PACKER作为它的打包器,ASCS_DEFAULT_UNPACKER作为它的解包器,我们先看看它们的定义:

#ifndef ASCS_DEFAULT_PACKER
#define ASCS_DEFAULT_PACKER ascs::ext::packer
#endif

#ifndef ASCS_DEFAULT_UNPACKER
#define ASCS_DEFAULT_UNPACKER ascs::ext::unpacker
#endif

可以看到,它们分别是packer和unpacker(注意来自ext命令空间,说明不严格属于ascs),如果想用别的,则自己在#include <ascs/ext/tcp.h>之前或者工程配置文件里面或者makefile文件里面先定义它们,或者用server_base<server_socket_base<xxx, xxx>>。

server_socket负责数据的收发和派发,缓存管理,具体为,当收到消息发送请求之后,先打包消息再入缓存,再调用asio::async_write异步发送数据,发送成功之后释放缓存;当接收到数据时,先调用解包器解包,解出来的消息先放入缓存,再调用asio::post异步派发数据(这样可尽快开始下一次asio::async_read读取数据),派发完成释放缓存,消息派发就是回调on_msg_handle,server_socket_base实现了这个函数),并打印消息到屏幕上,这就是你看到的结果(其中的abc由键盘输入):

[10140] Mon Mar 16 22:22:44 2020 -> service pump started.
[10140] Mon Mar 16 22:22:44 2020 -> begin to pre-create 16 server socket...
[10140] Mon Mar 16 22:22:44 2020 -> finished pre-creating server sockets.
[14704] Mon Mar 16 22:22:44 2020 -> -1 connecting success.
[13728] Mon Mar 16 22:22:44 2020 -> 15 client: (127.0.0.1:5050 127.0.0.1:56197) arrive.
abc
[14704] Mon Mar 16 22:22:52 2020 -> 15 recv(17): abc (from client)
[15752] Mon Mar 16 22:22:52 2020 -> -1 recv(17): abc (from server)

再看client的定义:

typedef ascs::tcp::client_socket_base<ASCS_DEFAULT_PACKER, ASCS_DEFAULT_UNPACKER> client_socket;
typedef ascs::tcp::single_client_base<client_socket> single_client;

从名字看,可以大概知道single_client只支持1条连接(还有支持多条连接的multi_client),它是一个single_client_base(真正的ascs类),它用client_socket来表示一条连接;client_socket是一个client_socket_base(真正的ascs类),它和服务器采用了一样的打包解包器,它除了有server_socket_base的所有功能之外,还包括发起异步连接请求、断线重连等。

那么server的监听端口是多少呢,single_client是如何知道连接地址的呢?答案在 include/ascs/config.h里面:

#ifndef ASCS_SERVER_IP
#define ASCS_SERVER_IP			"127.0.0.1"
#endif
#ifndef ASCS_SERVER_PORT
#define ASCS_SERVER_PORT		5050
#endif

注意server_base不使用ASCS_SERVER_IP,于是默认是监听本机所有IP地址上的指定端口的。如果不想通过宏来控制监听端口与连接地址呢?可以在start_service之前调用server_base的set_server_addr和single_client_base的set_server_addr。

那么如何处理消息呢(除了调试助手之类的工具,没有人的业务是仅仅打印消息到屏幕这么简单)?此时就要重写on_msg_handle虚函数了,如下(以服务端为例,客户端也一样,只是从client_socket继承):

#include <iostream>

#include <ascs/ext/tcp.h>
using namespace ascs;
using namespace ascs::tcp;
using namespace ascs::ext;
using namespace ascs::ext::tcp;

#define QUIT_COMMAND	"quit"

class s_socket : public server_socket
{
public:
	s_socket(i_server& server) : server_socket(server) {}

protected:
	virtual bool on_msg_handle(out_msg_type& msg) {printf("I see you: %s\n", msg.data()); return true;}
};

int main()
{
	service_pump sp;
	server_base<s_socket> s(sp);
	single_client c(sp);

	sp.start_service();
	while (sp.is_running())
	{
		std::string str;
		std::getline(std::cin, str);
		if (str.empty())
			;
		else if (QUIT_COMMAND == str)
			sp.stop_service();
		else
		{
			c.send_msg(str + " (from client)");
			s.broadcast_msg(str + " (from server)");
		}
	}
}

输出结果如下(其中abc由键盘输入):

[9268] Sun Mar 22 11:06:03 2020 -> service pump started.
[9268] Sun Mar 22 11:06:03 2020 -> begin to pre-create 16 server socket...
[9268] Sun Mar 22 11:06:03 2020 -> finished pre-creating server sockets.
[16768] Sun Mar 22 11:06:03 2020 -> 15 client: (127.0.0.1:5050 127.0.0.1:54199) arrive.
[16580] Sun Mar 22 11:06:03 2020 -> -1 connecting success.
abc
I see you: abc (from client)
[12772] Sun Mar 22 11:06:07 2020 -> -1 recv(17): abc (from server)

 

上一篇:ascs 简明开发教程(1)下一篇:ascs 简明开发教程(3)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值