C++服务开发入门指南
  • 序言
  • 前言
  • 一、一个简单的服务
    • 1 什么是服务
    • 2 服务可以用来做什么
    • 3 简单服务框架
  • 二、网络通信服务框架
    • 1 网络服务的基本概念
    • 2 增加监听端口
    • 3 处理客户端会话
    • 小结
  • 三、添加基础模块
    • 1 日志模块
    • 2 定时器
    • 3 事件机制
    • 4 线程池
    • 5 线程安全
    • 小结
  • 四、一个聊天服务
    • 1 需求描述及分析
    • 2 概要设计
    • 3 创建服务项目
    • 4 ClientUser实现
    • 5 RoomMgr实现
    • 6 ChatRoom实现
    • 7 RoomIDMgr实现
    • 小结
  • 五、测试、迭代及重构
    • 1 测试
    • 2 迭代
    • 3 重构
    • 4 版本号
  • 六、架构设计
    • 1 单点服务
    • 2 分布式服务
  • 七、部署及发布
    • 1 部署环境
    • 2 编译环境
    • 3 部署服务
    • 4 发布服务
  • 八、线上问题处理
    • 1 线上问题
    • 2 问题处理
  • 九、程序员的职业规划
    • 职业规划
Powered by GitBook
On this page
  • 1、监听端口(ListenPort)
  • 2、连接(Connection)
  • 3、会话(Session)
  • 4、连接使用者(LinkUser)
  • 5、ASIO网络库
  1. 二、网络通信服务框架

1 网络服务的基本概念

一个网络服务,通常是部署在服务器上,等待其他服务或客户端连接进来,对于等待连接的服务来说,我们可以把所有的接入请求的对端,都称为客户端。

以下,我们介绍一些基本概念。

1、监听端口(ListenPort)

客户端如果想要和一个服务建立TCP连接,需要指定服务的IP和端口,发起连接请求。客户端指定的端口号,就是服务端的监听端口。

应用服务在选择监听的端口时,尽量避免和知名端口冲突。所谓知名端口,一般是众所周知、知名服务常用的服务端口,如80(http)、443(https)、21(ftp)、22(ssh)等。

这些端口不是不可以使用,但使用后容易在配置时产生冲突,导致监听端口失败,服务无法启动等问题。因此,自己开发服务选择端口时,一般是在[1024,65535]之间进行选择。

服务端选择一个端口(例如20001)进行监听后,客户端就可以向服务所在IP地址的20001端口,发起TCP连接。

在socket编程中,服务端绑定一个端口,建立一个套接字,执行listen函数,等待客户端的连接接入。

2、连接(Connection)

客户端向服务端发起TCP连接请求,经过三次握手之后,就建立了一个TCP连接。

Socket编程中,连接建立成功后触发accept函数,并返回一个新的套接字,之后与这个客户端的信息收发,都在这个新的套接字上执行。

服务端可以同时维持多少个客户端连接呢?

Socket使用四元组标示一个连接,即:源IP地址,源端口,目的IP地址,目的端口。

在连入服务的连接中,目的IP地址是服务器IP地址,目的端口时服务端的监听端口,这两个时固定不变的。

而源IP地址,源端口,是发起连接的客户端的IP和端口。

一台电脑端口分配上限是65535,因此,一台机器,不断的向服务端发起TCP连接,因为客户端是连出,每次会在客户端的机器上分配一个新的端口,因此这台机器TCP连出的上限是65535,但这不是服务端维持连接的上限。

服务端监听的始终是一个端口,为连入客户端新建一个socket,但并不会再占用新的端口。服务端的开销是文件描述符,socket占用的内存(每个大概4K左右),以及网络带宽足够大,能够保证连接请求可以及时响应。

因此,一台4G内存的服务器,在网络带宽不是瓶颈,且服务配置文件没设限制的情况下,百万连接应该是可以支撑的。

3、会话(Session)

客户端和服务建立一个连接后,就像两个人接通了电话,可以在这个线路上互传消息,我们可以称这是一个会话。

连接是更底层的,会话则在连接的基础上,维护了更多的信息,比如这次会话的ID,会话的连接类型,会话时长,会话的连接状态等。

会话是业务层用来更方便的管理连接的。

4、连接使用者(LinkUser)

服务端维持了很多连接,业务层需要将不同身份的连接区分开,为其提供不同的服务。

比如,有的连接是用户客户端连入,我们可以将其命名为ClientUser;对于大厅服务连入的,可以命名为LobbyUser;对于聊天服务连入的,可以命名为ChatSvrUser。

因为不同身份的连接,需要处理的业务并不相同,因此连接建立后,要尽快识别对端的身份,为其建立对应的LinkUser。

5、ASIO网络库

Asio是一个跨平台的 C++ 开发包用来处理网络和低级 I/O 编程,通过先进的 C++ 方法为开发人员提供连续异步模型。

其官方网址为https://think-async.com/Asio/ ,里面有详细的资料和文档。

Asio包含在boost库中,在C++11后,可以在不使用boost库的情况下,使用Asio的网络模型。它也是最有可能进入C++标准库的网络模型,因此,后面我们使用non-Boost的ASIO实现基础的网络io功能。

Previous二、网络通信服务框架Next2 增加监听端口

Last updated 2 years ago