| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> 《ZLToolKit源码学习笔记》(19)网络模块之套接字封装 -> 正文阅读 |
|
[网络协议]《ZLToolKit源码学习笔记》(19)网络模块之套接字封装 |
系列文章目录《ZLToolKit源码学习笔记》(1)VS2019源码编译 《ZLToolKit源码学习笔记》(2)工具模块之日志功能分析 《ZLToolKit源码学习笔记》(3)工具模块之终端命令解析 《ZLToolKit源码学习笔记》(4)工具模块之消息广播器 《ZLToolKit源码学习笔记》(6)线程模块之整体框架概述 《ZLToolKit源码学习笔记》(7)线程模块之线程池组件:任务队列与线程组 《ZLToolKit源码学习笔记》(8)线程模块之线程负载计算器 《ZLToolKit源码学习笔记》(9)线程模块之任务执行器 《ZLToolKit源码学习笔记》(11)线程模块之工作线程池WorkThreadPool 《ZLToolKit源码学习笔记》(12)事件轮询模块之整体框架概述 《ZLToolKit源码学习笔记》(13)事件轮询模块之管道的简单封装 《ZLToolKit源码学习笔记》(14)事件轮询模块之定时器 《ZLToolKit源码学习笔记》(15)事件轮询模块之事件轮询器EventPoller 《ZLToolKit源码学习笔记》(16)网络模块之整体框架概述 《ZLToolKit源码学习笔记》(17)网络模块之基础接口封装类SockUtil 《ZLToolKit源码学习笔记》(18)网络模块之Buffer缓存 《ZLToolKit源码学习笔记》(19)网络模块之套接字封装(本文) 前言套接字抽象封装,包含TCP服务器、TCP客户端(TCP session)、UDP套接字、与EventPoller关联处理描述符事件,数据发送以及接收处理等。 目录一、概述以上,是套接字封装模块的类图以及每个类的大致功能,上层使用最多的是Socket和SocketHelper两个类。 二、功能分析2.1、SockFD、SocketNum描述符封装,SockNum作为SockFD的成员变量,SockFD作为Socket的成员变量。 ?? 2.2、SocketSocket封装了针对文件描述符的各种操作,包括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 Clientconnect 2.2.3、仅用于UDPbindUdpSock、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、SocketHelperSocket对象的包装类,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进行操作。 |
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 | -2025/1/8 5:41:41- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |