一直对多线程和网络编程比较感兴趣,自学了一些winsock和TCP/IP的知识,一年前因为项目需要,接触了一段时间的ACE,使用了其中的 Reactor框架,那时对网络编程还不甚熟悉,感觉ACE挺神秘。其间也就是根据项目需要使用了一下其中的某个框架,对于ACE内部的实现原理,也没怎 么多想。
随着在网络以及多线程方面知识的积累,近日忽然想要学习一下ACE库的源代码,借鉴一下它的实现手法。到ACE的官网上下载了 ACE的源代码,准备开始看时,却如堕五里雾中了,不知从何下手。也难怪,ACE库如此庞大,这样贸然着手没有任何准备的去学习,应该不会收到很好的效 果,所以我决定分以下几个步骤来学习:
1、找一个较轻量级的服务器框架,如spserver,先学习一下,为进军ACE做准备。
2、重温一下《C++网络编程》的两本书,复习一下ACE库的使用方法和ACE框架的基础知识。
3、从ACE库内部的几个框架着手,深入学习ACE库的源代码。
我想通过这三个步骤,循序渐进并假以时日,应该可以达到学习ACE库的目的。
学习spserver几日,我大概弄清楚了它的框架,根据我的理解,我画了一个spserver的框架图,如下:
由上图可知,程序在启动后,主线程负责创建:
1、连接接收套接字AcceptSocket,并设置必要的属性,如非阻塞等等
2、一个完成端口对象,并将AcceptSocket套接字与它关联
3、一个单独的子线程用于接收连接,该线程首先在AcceptSocket上调用Accept,然后调用WaitForSingleObject等待连接事件
4、创建2个任务队列,用于存储服务端的待执行任务。
5、创建2个线程池,在后面用于执行任务队列中的任务
6、主线程此后不断调用GetQueuedCompletionStatus,检查该IOCP,从而找出待处理任务,然后根据任务的类别,有连接事件时,通知连接接收线程;将Recv任务放入任务队列1;将Send任务放入任务队列2。然后将这两个任务队列中的任务交由2个线程池处理。
就这样,程序就有4个并行的部分:
1、连接接收线程
2、主线程,也就是任务产生和分配线程
3、线程池1,处理Recv任务
4、线程池2,处理Send任务
其中主线程和2个线程池之间是生产者和消费者的关系,主线程不断产生新的任务放到任务队列中,线程池不断从任务队列中取出任务并执行。
至 于所谓的半同步/半异步我想是这样的:套接字本身是异步套接字,也就是说函数调用如Accept,Recv,Send等都是异步执行的。但是由于连接接收 线程在指定位置处要等待主线程发出的连接进入事件,所以实质上这两个线程之间就构成了同步关系。按照我的理解,这就是所谓的半同步/半异步,当然我不确定 是否正确。
以上是我学习spserver的一些心得,及对其框架的简单理解,纯粹出于对网络编程的热爱,放于此处,一为备忘,二为交流。欢迎广大有共同兴趣的朋友批评指正。
本文分享了作者学习SPServer服务器框架的心得,包括其框架结构的理解与绘制,并阐述了如何通过SPServer作为跳板进一步深入研究ACE库的计划。
7350

被折叠的 条评论
为什么被折叠?



