上一篇"跨平台(Windows+Linux)的Socket通讯程序"给出了Socket通讯底层的一些函数的包装方法/类,同时屏蔽了操作系统(Windows/Linux)的不同。

上一篇只是对通讯底层方法的封装,并没用涉及应用,这一篇将基于上一篇,并结合"跨平台(Windows+Linux)的线程辅助程序",讨论一个实用化的Socket通讯程序的体系结构。

一、结构图

下面给出了一个Socket通讯应用的大致体系结构图。

图中,给出了一些概念类和它们所处的层次,大致上,分为三个处理层次以及一个辅助层次。

底层封装函数:这个层次的内容在(一)中已论述,主要是对Socket原生函数的封装,之所以既有CSocketWrap类,又有独立的辅助函数,是考虑到一般性与特殊性兼顾,对通常的通讯逻辑,可在CSocketWrap类中处理,对特殊的要求,可直接调用底层的封装函数。

通用的Server和Client层:因为Server端与Client端通讯逻辑不同,宜采用两个类分别处理,本文没有将UDP与TCP协议分开,如果逻辑要更清晰一些,也可以写成4个类。

以上两层都未涉及业务逻辑,完成的是通用的通讯功能,发送或接收函数“看到”的是“数据流”或“数据包”,而忽视其意义。最核心的功能函数有3个:发送函数、接收函数、通讯失败判断函数,通常情况下,发送、接收函数都是采用非阻塞方式,通讯失败函数被更上层的业务逻辑层所调用,有助于判断是否需要重发、继续保持连接等业务逻辑。

业务逻辑层:该层完成通讯的业务逻辑,每个应用都会有所不同,这里分了4个类,每个类都将包含一个协议封装/解析类,用于无意义的“数据流”或“数据包”与有意义的“数据结构”之间的转换。

协议解析/封装层:该层实际上不属于通讯程序本身,是对外通讯协议与对内通讯协议之间的转换。对外的通讯协议格式与应用内部使用的数据格式通常是不同的,需要两个类分别进行转换。

对通讯协议的解析,UDP与TCP一般情况下是不同的(见(一)中UDP与TCP的区别)。对于比较复杂的协议,协议解析/封装类可能有多个,本文只是示意性的给出一个。关于通讯协议的解析和封装,这里不做介绍。

二、一些讨论

1.数据的发送与接收宜与业务逻辑分开,这样就可以编写一个较为通用的发送与接收过程类(业务逻辑一般不能通用),要做到这点,比较合适的做法是采用非阻塞的发送与接收函数,并且将发送与接收过程放到单独的一个线程中,通过线程间信息共享,与业务线程传递要发送与接收的数据。

2.实际上,通用Server/Client层完成的是Socket的“业务”,如果采用多线程,宜在这一层完成,上面的业务层只需调用这一层的发送或接收方法即可。

跨平台(windows+linux)的线程辅助程序,跨平台(Windows+Linux)的Socket通讯程序(二)—结构...相关推荐

  1. linux使用线程实现生产者消费者问题,Linux下生产者与消费者的线程实现

    代码见<现代操作系统> 第3版. 为了显示效果,添加了printf()函数来显示运行效果 #include #include #define MAX 20 pthread_mutex_t ...

  2. c++语言socket udp聊天程序,使用C/C++实现Socket聊天程序

    使用C/C++实现Socket聊天程序 Initsock.h文件 // initsock.h文件 #include #include #include #include #pragma comment ...

  3. linux下线程不需要死循环么,Linux多线程程序死循环问题调试

    软件在某个时刻停止服务,CPU占用达到100%+,这种问题一个可能的原因是产生了死循环,假设程序某处存在潜在的死循环,并在某种条件下会引发,本文以一个示例来定位出现死循环的位置.[喝小酒的网摘]htt ...

  4. Linux内核线程kernel thread详解--Linux进程的管理与调度(十)【转】

    转自:https://blog.csdn.net/gatieme/article/details/51589205 版权声明:本文为博主原创文章 && 转载请著名出处 @ http:/ ...

  5. Linux内核线程kernel thread详解--Linux进程的管理与调度

    内核线程 为什么需要内核线程 Linux内核可以看作一个服务进程(管理软硬件资源,响应用户进程的种种合理以及不合理的请求). 内核需要多个执行流并行,为了防止可能的阻塞,支持多线程是必要的. 内核线程 ...

  6. linux内核线程绑定到单个核,linux 将进程或者线程绑定到指定的cpu上

    基本概念 cpu亲和性(affinity) CPU的亲和性, 就是进程要在指定的 CPU 上尽量长时间地运行而不被迁移到其他处理器,也称为CPU关联性:再简单的点的描述就将指定的进程或线程绑定到相应的 ...

  7. linux使用线程实现生产者消费者问题,Linux平台下线程同步,实现“生产者消费者问题”...

    (1)线程同步,实现"生产者消费者问题" 要求:缓冲区大小为20,生产者每次放一个产品,消费者每次取走一个产品:生产者和消费者至少2个. (2)代码如下: #include #in ...

  8. Linux创建线程读取双口数据,linux环境下读写一次双口ram尽然要十几个毫秒。(附驱动代码)...

    linux环境下读写一次双口ram尽然要十几个毫秒.(附驱动代码) 我用的双口ram是IDT70V28,手册上说的读写时间应该是几个纳秒,我写了个linux驱动,然后做测试,发现读写一次的时间尽然是十 ...

  9. PC端程序和安卓应用进行socket通讯

    实现功能: 1.PC端发送命令给app 2.app收到后,根据命令执行操作 3.app将操作的结果返回给PC 首先来看PC端发送接收程序代码(文件名Client.java): 1. connect/r ...

最新文章

  1. Algorithms_二叉树二分搜索树初探
  2. # Schedulerx正式登陆Ali-k8s应用目录
  3. 读《白帽子讲Web安全》之客户端脚本安全(一)
  4. python map lambda 分割字符串_[转] Python特殊语法:filter、map、reduce、lambda
  5. dedesmc 手机端生成静态页
  6. GBDT 算法:原理篇
  7. excel亮灯怎么设置_EXCEL高手进,用EXCEL实现亮灯功能
  8. 新一代RPC框架-GRPC
  9. SpringBoot 使用小技巧合集
  10. oracle psu版本确认,Oracle PSU更新
  11. python 多线程 全局锁_python的多线程+GIL全局解释器锁+其他LOCK
  12. C/C++[codeup 2063]日期累加
  13. 《秘密》-- 东野圭吾
  14. 10 分钟搞定 Vim 编辑器常用命令!
  15. 双线macd指标参数最佳设置_macd线参数如何设置最佳买点,MACD指标的参数设置,MACD参数设置多少最佳...
  16. 高级软件工程第三次作业:数独游戏界面功能
  17. 【Tensorflow教程笔记】TensorFlow Datasets 数据集载入
  18. c语言习题集-----收藏归纳版
  19. css之display:inline-block布局
  20. PTA - 数据库合集16

热门文章

  1. 中国科学家突破二氧化碳人工合成淀粉技术
  2. 祝融号火星车亮相,每小时仅移动40米,为何比乌龟还慢?
  3. 12名高校教师被降级!打破职称终身制,山东在行动!
  4. 滴滴出行的数据架构和信息流处理思路解析
  5. Elasticsearch 的使用,看这一篇就够了!
  6. (pytorch-深度学习系列)pytorch避免过拟合-权重衰减的实现-学习笔记
  7. 堆排序和归并排序 java代码实现
  8. Unity在运行时(代码中)设置材质的渲染模式(RenderingMode)
  9. 代理网关设计与实现(基于NETTY)
  10. 双11还能创造什么新技术?