Linux组件封装(八)——Socket的封装

我们要封装Socket,首先我们需要了解Socket需要哪些要素:

  1) 首先,一个套接字创建后,需要绑定一块网卡的IP,以及连接的对口号,所以我们先封装InetAddr。

在class中,仅有的一个私有成员就是struct sockaddr_in类型的一个对象,我们需要将该对象的几种赋值与创建封装到类中,这样,我们仅需传递相应的IP与port即可获得一个addr。

在这里,我们为了方便获得该addr的IP及port,封装几个将addr转化为IP及port的函数,这样我们仅需调用函数即可。

然后,我们就可以开始封装Socket的一些基本操作了。

在该类的封装中,我们需要将相应的绑定、监听、接收、设置等操作封装好,这样,我们仅需调用该对象的相应函数,即可获得一个处于监听中的套接字。

对于Linux中自带的read和write函数,我们需要进行另外的封装,由于read函数不一定能将缓存区中的数据读完,所以我们需要实现一个能将读满指定字节的函数readn函数,以及相对应的函数,还需要一个读满一行的高效readline函数。

在SocketIO封装中,readline函数是一个较高效的函数,它通过先预览内核中的一大块数据,查看是否有‘\n‘的存在,若存在,则读取到‘\n‘为止,否则将该块数据全部读取,然后继续预览。

接下来我们需要封装TcpConnection,我们需要进一步封装,将Socket与SocketIO相结合,同时设置好相应的接口与回调函数,

接下来,我们需要将IO复用模型epoll与TcpConnection封装在EpollPoller中,我们需要将epoll的大部分操作封装好,与我们前面的接口相对应。我们需要将Connection的名单保存起来,当一个连接断开时,及时将该Connection从名单中删除,然后通过调用回调函数,设置相应的执行函数。在epoll_wait中,当事件过多时,我们需要将events的容量扩大,需要注意。

最后,我们可以开始服务器的最后封装,将EpollPoller与Socket结合封装为TcpServer,我们只需将新建的Socket中的套接字fd传递给EpollPoller,再通过客户实现的功能来初始化相应的回调函数即可,这样,我们的Socket基本封装完毕。

相关代码及简单的测试代码,可以到下面查看:

  https://github.com/gjn135120/My_EchoLib/tree/master/Socket

时间: 2025-01-04 01:07:13

Linux组件封装(八)——Socket的封装的相关文章

Linux组件封装之五:生产者消费者问题

生产者,消费者问题是有关互斥锁(MutexLock).条件变量(Condition).线程(Thread)的经典案例: 描述的问题可以叙述为 生产者往buffer中投放产品,而消费者则从buffer中消费产品. 生产着消费者问题的难点在于: 为了缓冲区数据的安全性,一次只允许一个线程进入缓冲区投放或者消费产品,这个buffer就是所谓的临界资源. 生产者往缓冲区中投放产品时,如果缓冲区已满,那么该线程需要等待,即进入阻塞状态,一直到消费者取走产品为止. 相应的,消费者欲取走产品,如果此时缓冲区为

Linux组件封装(五)一个生产者消费者问题示例

生产者消费者问题是计算机中一类重要的模型,主要描述的是:生产者往缓冲区中放入产品.消费者取走产品.生产者和消费者指的可以是线程也可以是进程. 生产者消费者问题的难点在于: 为了缓冲区数据的安全性,一次只允许一个线程进入缓冲区,它就是所谓的临界资源. 生产者往缓冲区放物品时,如果缓冲区已满,那么需要等待,一直到消费者取走产品为止. 消费者取走产品时,如果没有物品,需要等待,一直到有生产者放入为止. 第一个问题属于互斥问题,我们需要使用一把互斥锁,来实现对缓冲区的安全访问. 后两个属于同步问题,两类

Linux socket 类封装 (面向对象方法)

1 /* 2 * socketfactory.h 3 * 4 * Created on: 2014-7-19 5 * Author: root 6 */ 7 8 #ifndef SOCKETFACTORY_H_ 9 #define SOCKETFACTORY_H_ 10 #include<sys/types.h> 11 12 /* 13 * 在网路编程中, 一般分为服务端和客户端,两者的行为有相似之处,也有非常多的不同.在linux中对socket程序设计 14 * 仅提供了socket(),

cross socket接口封装

cross socket是DELPHI跨操作系统的SOCKET通讯库,支持WINDOWS,LINUX,MACOS操作系统. 经过封装的接口,调用异常简单. procedure TForm1.Button2Click(Sender: TObject); //REST查询 begin var url, sql1, sql2: string; sql1 := TNetEncoding.URL.Encode('select * from tgoods'); sql2 := TNetEncoding.UR

学习java随笔第八篇:封装、继承、多态

java和c#一样都是面向对象的语言. 面向对象的语言有三大特征:封装.继承.多态 封装 封装:隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别. class Person2 { private String name; public void setName(String name) { this.name=name; } public String getName() { return name; } private String sex; public voi

bsd socket 简单封装。支持android、ios、mac osx

cocos2d-x官方没有封装原生socket,只提供了websocket,如果我们需要socket,不同团队有不同的造轮子的方案,其中使用Asio库的比较多,但是Asio库太过于庞大,我不太想用.其实只需要简单封装一下bsd socket就好了,几十行代码而已. 注意如果在android中测试,需要添加网络访问权限,而且不能在主线程中使用. 贴一发代码,只是简单测试了下,如果有问题再慢慢完善. 1 #ifndef __cpp_test__Socket__ 2 #define __cpp_tes

嵌入式linux C++语言(三)——封装(Encapsulation)

嵌入式linux C++语言(三)--封装(Encapsulation) 一.封装简介 C语言等面向过程编程中,数据以及数据的相关操作函数都是分离的独立个体:在C++等面向对象编程中,数据以及数据的相关操作被设计为对象,对象包括属性(数据)和操作(函数),两者共同构成对象实体(即类实体).面向对象编程使程序更模块化,更易读易写,提升了代码重用到一个更高的层次. 面向对象编程中,数据和数据的操作封装为了对象.封装可以隐藏实现细节,使得代码模块化,是把过程和数据包围起来,对数据的访问只能通过已定义的

关于linux上cron服务的python封装工具

关于cron:定时任务服务,一般linux自带且已启动.(pgrep cron查看cron服务是否启动了.) 关于plan:一个通过python来定制cron服务的工具.其官网:http://plan.readthedocs.org/ plan的使用例子: 例子1: from plan import Plan cron = Plan() output = dict(stdout='~/stdout.log', stderr='~/stderr.log') cron.command('date',

快速学习C语言三: 开发环境, VIM配置, TCP基础,Linux开发基础,Socket开发基础

上次学了一些C开发相关的工具,这次再配置一下VIM,让开发过程更爽一些. 另外再学一些linux下网络开发的基础,好多人学C也是为了做网络开发. 开发环境 首先得有个Linux环境,有时候家里机器是Windows,装虚拟机也麻烦,所以还不如30块钱 买个腾讯云,用putty远程练上去写代码呢. 我一直都是putty+VIM在Linux下开发代码,好几年了,只要把putty和VIM配置好,其实 开发效率挺高的. 买好腾讯云后,装个Centos,会分配个外网IP,然后买个域名,在DNSPod解析过去