《ZLToolKit源码学习笔记》(19)网络模块之套接字封装

系列文章目录 

《ZLToolKit源码学习笔记》(1)VS2019源码编译

《ZLToolKit源码学习笔记》(2)工具模块之日志功能分析

《ZLToolKit源码学习笔记》(3)工具模块之终端命令解析

《ZLToolKit源码学习笔记》(4)工具模块之消息广播器

《ZLToolKit源码学习笔记》(5)工具模块之资源池

《ZLToolKit源码学习笔记》(6)线程模块之整体框架概述

《ZLToolKit源码学习笔记》(7)线程模块之线程池组件:任务队列与线程组

《ZLToolKit源码学习笔记》(8)线程模块之线程负载计算器

《ZLToolKit源码学习笔记》(9)线程模块之任务执行器

《ZLToolKit源码学习笔记》(10)线程模块之线程池

《ZLToolKit源码学习笔记》(11)线程模块之工作线程池WorkThreadPool

《ZLToolKit源码学习笔记》(12)事件轮询模块之整体框架概述

《ZLToolKit源码学习笔记》(13)事件轮询模块之管道的简单封装

《ZLToolKit源码学习笔记》(14)事件轮询模块之定时器

《ZLToolKit源码学习笔记》(15)事件轮询模块之事件轮询器EventPoller

《ZLToolKit源码学习笔记》(16)网络模块之整体框架概述

《ZLToolKit源码学习笔记》(17)网络模块之基础接口封装类SockUtil

《ZLToolKit源码学习笔记》(18)网络模块之Buffer缓存

《ZLToolKit源码学习笔记》(19)网络模块之套接字封装(本文)

《ZLToolKit源码学习笔记》(20)网络模块之TcpServer

《ZLToolKit源码学习笔记》(21)网络模块之TcpClient与Session

《ZLToolKit源码学习笔记》(22)网络模块之UdpServer


前言

套接字抽象封装,包含TCP服务器、TCP客户端(TCP session)、UDP套接字、与EventPoller关联处理描述符事件,数据发送以及接收处理等。


目录

     系列文章目录

前言

一、概述

二、功能分析

2.1、SockFD、SocketNum

2.2、Socket

2.2.1、仅用于TCP Server监听

2.2.2、仅用于TCP Client

2.2.3、仅用于UDP

2.2.4、通用接口

2.3、SocketHelper

2.4、MutexWrapper


一、概述

以上,是套接字封装模块的类图以及每个类的大致功能,上层使用最多的是Socket和SocketHelper两个类。


二、功能分析

2.1、SockFD、SocketNum

描述符封装,SockNum作为SockFD的成员变量,SockFD作为Socket的成员变量。

2.2、Socket

Socket封装了针对文件描述符的各种操作,包括TCP与UDP套接口基础概念封装、数据的发送与接收控制、事件回调处理等。

Socket可用于TCP Server监听(listen socket)、TCP Server会话(accept后的socket)、TCP Client、UDP Server/Client类型。

根据以上类型,可以将Socket封装的众多接口进行分类:

2.2.1、仅用于TCP Server监听

listen、cloneFromListenSocket、SetOnAccept、setOnBrforeAccept

2.2.2、仅用于TCP Client

connect

2.2.3、仅用于UDP

bindUdpSock、bindPeerAddr

2.2.4、通用接口

ALL:createSocket、emitErr、enableRecv、rawFD、sockType、getPoller、closeSock

TCP Server监听除外:setOnRead、setSendTimeOutSecond、isSocketBusy、setSendFlags、getSendBufferCount、elapsedTimeAfterFlushed、send、setOnSendResult、setOnFlush

2.3、SocketHelper

Socket对象的包装类,Socket作为其保护成员变量,它的派生类中可以直接操作。

使用Socket发送数据,必须调用其send接口,而SocketHelper扩展了发送数据的方式,它支持使用<<运算符以及可以发送重载了ostringstream<<的任意类型的对象,这是因为它继承了SocketSender类,此时必须实现send(Buffer::Ptr buf)纯虚函数。

如果A Poller线程收到的客户端socket数据,在之前该socket已经被添加到B Poller线程去处理了,此时,则需要将数据转移到B Poller线程,需要异步的将任务添加进去。基于此,SocketHelper继承实现了TaskExecutorInterface接口类。比如,A线程是UDP Server,收到某客户端第一次发送数据时(视为客户端连接),使用bind和connect重新创建一个与该客户端关联的socket,然后将该socket放在B线程中管理,后续该客户端的所有数据将由新的socket处理。但是,可能在socket被放到B线程管理之前,客户端发送数据比较快,原来的A线程又收到了数据,此时就需要将A线程收到的数据转移到B线程去处理。

继承自SocketHelper的类目前有两个,Session和TcpClient。

2.4、MutexWrapper

对锁进行封装,可以设置锁是否生效,用于Socket类中,如果针对Socket的操作都在同一个线程,则可以不用加锁,如果可能被多个线程访问,则需要加锁。从代码中使用来看,目前仅TcpClient设置了锁生效。这是因为TcpClient是在用户线程中创建,用户线程和Poller线程都会对socket进行操作。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秦时小

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值