目錄
关于 Poco::TCPServer框架 (windows 下使用的是 select模型) 学习笔记.,pocotcpserver
说明
关于开始前的了解:
对构造函数初始化顺序的理解
开始
代码中主要使用类的关系
主要的几个类:
流程图:
先看看 PooledThread 的流程吧
 再看下TCPServer 主宰的流程
图片过宽,不能显示(请 在新标签中打开图片.谢谢.)
首頁 後端開發 php教程 关于 Poco::TCPServer框架 (windows 下使用的是 select模型) 学习笔记.,pocotcpserver_PHP教程

关于 Poco::TCPServer框架 (windows 下使用的是 select模型) 学习笔记.,pocotcpserver_PHP教程

Jul 13, 2016 am 10:01 AM
poco

关于 Poco::TCPServer框架 (windows 下使用的是 select模型) 学习笔记.,pocotcpserver

 

说明

为何要写这篇文章 ,之前看过阿二的梦想船的<:tcpserver> http://www.cppblog.com/richbirdandy/archive/2010/09/10/123994.html

无奈代码太多,看起繁琐.所以 准备 以流程图简化,便于理解.也方便自己以后使用.

本文内容 是基于window api分析的.

本文的poco是1.4.6p4 (2014-04-18)版本的. 虽然现在poco版本是1.6 但调用改动不大.

poco下载地址:http://pocoproject.org/releases/

本文分析以 TimeServer.cpp 作为入口分析:

关于开始前的了解:

1,Inline 内联函数:可以参考:

http://blog.sina.com.cn/s/blog_90e888f50100zgo2.html

主要是提升执行效率.

2,类成员函数的 重载,重写,隐藏,

参考:

dazhong159 的

http://blog.csdn.net/dazhong159/article/details/7844369

代码中大量使用,重写,隐藏.

3,select模型的原理:

引用

很幽默的讲解六种Socket I/O模型

http://blog.csdn.net/normalnotebook/article/details/999840

的内容:

  for i:=0 to fd_read.fd_count-1 do //注意,fd_count 

           是同步操作.

老陈非常想看到女儿的信。以至于他每隔10分钟就下楼检查信箱,看是否有女儿的信~~~~~
在这种情况下,"下楼检查信箱"然后回到楼上耽误了老陈太多的时间,以至于老陈无法做其他工作。
select模型和老陈的这种情况非常相似:周而复始地去检查......如果有数据......接收/发送.......

<span>.....
 MainSock :</span>=<span> socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
 addr.sin_family :</span>=<span> AF_INET;
 addr.sin_port :</span>= htons(<span>5678</span><span>);
 addr.sin_addr.S_addr :</span>=<span> htonl(INADDR_ANY);
 bind( MainSock, @addr, </span><span>sizeof</span><span>(addr) );
 listen( MainSock, </span><span>5</span><span> );
 
 </span><span>while</span> (not Terminated) <span>do</span><span>
 begin
 FD_ZERO( fd_read );
 FD_SET( MainSock, fd_read );
 timeout.tv_sec :</span>= <span>0</span><span>;
 timeout.tv_usec :</span>= <span>500</span><span>;
 </span><span>if</span> <span>select</span>( <span>0</span>, @fd_read, nil, nil, @timeout ) > <span>0</span> then <span>//</span><span>至少有1个等待Accept的connection</span>
<span> begin
 </span><span>if</span><span> FD_ISSET( MainSock, fd_read ) then
 begin
 </span><span>for</span> i:=<span>0</span> to fd_read.fd_count-<span>1</span> <span>do</span> <span>//</span><span>注意,fd_count <= 64,也就是说select只能同时管理最多64个连接</span>
<span> begin
 len :</span>= <span>sizeof</span><span>(addr);
 ASock :</span>=<span> accept( MainSock, addr, len );
 </span><span>if</span> ASock <><span> INVALID_SOCKET then
 ....</span><span>//</span><span>为ASock创建一个新的线程,在新的线程中再不停地select</span>
<span> end; 
 end; 
 end; 
 end; </span><span>//</span><span>while (not self.Terminated)</span>
<span> 
 shutdown( MainSock, SD_BOTH );
 closesocket( MainSock );
 end;<br /><br /></span>
登入後複製

所以,select模型,只能用于一般的小型连接....高并发是不行的.

4,

对构造函数初始化顺序的理解

C++构造函数按下列顺序被调用:
(1)任何虚拟基类的构造函数按照它们被继承的顺序构造;
(2)任何非虚拟基类的构造函数按照它们被继承的顺序构造;
(3)任何成员对象的构造函数按照它们声明的顺序调用;
(4)类自己的构造函数。

5,关于 FastMutex 互斥变量

bool NotificationQueue::empty() const
{
FastMutex::ScopedLock lock(_mutex);
return _nfQueue.empty();
}

在 empty() 执行完成后 调用 ~FastMutex::ScopedLock析构函数来释放.

window下是使用的临界区:

class Foundation_API MutexImpl
{
protected:
MutexImpl();
~MutexImpl();
void lockImpl();
bool tryLockImpl();
bool tryLockImpl(long milliseconds);
void unlockImpl();

private:
CRITICAL_SECTION _cs;//临界区
};

  可以看见,windows 下环境使用的临界区.

6,关于线程:

window下使用

_thread = (HANDLE) _beginthreadex(NULL, _stackSize, ent, this, 0, &threadId);

执行线程的操作.

7,等待事件,连接请求的同步是使用的

WaitForSingleObject(这也是我的最爱)

通过SetEvent () ,ResetEvent() 来激活重置.

8,static_cast<> reinterpret_cast<> dynamic_cast<> 的使用.

可参考:

http://www.cnblogs.com/bastard/archive/2011/12/14/2288117.html

http://www.cnblogs.com/jerry19880126/archive/2012/08/14/2638192.html

像代码中:

void* pThread;

reinterpret_cast(pThread)->_pRunnableTarget->run();

//reinterpret_cas 这个转换是最“不安全”的,两个没有任何关系的类指针之间转换都可以用这个转换实现,举个例子

_threadId = static_cast(threadId);

//static_cast 用于基本的数据类型转换(char,int),及指针之间的转换

9,关于智能(灵巧)指针auto_ptr.

auto_ptr 简单点说,就是 保证创建的资源 在退出时能被free(无论有没有异常)

std::auto_ptr pConnection(_pConnectionFactory->createConnection(pCNf->socket()));

AutoPtr pNf = _queue.waitDequeueNotification(idleTime);

可以直接 在中找到

template
class auto_ptr
{ // wrap an object pointer to ensure destruction

可以参考:

More Effective C++中文版.pdf 7.4 Item M28:灵巧(smart)指针 章节(baidu 查到下载)

http://blog.chinaunix.net/uid-9525959-id-2001803.html

中的片段:

如何避免使用auto_ptr的缺陷

auto_ptr并不是完美无缺的,它的确很方便,但也有缺陷,在使用时要注意避免。首先,不要将auto_ptr对象作为STL容器的元素。C++标准明确禁止这样做,否则可能会碰到不可预见的结果。
auto_ptr的另一个缺陷是将数组作为auto_ptr的参数:
auto_ptr pstr (new char[12] ); //数组;为定义

记住不管什么时候使用数组的new操作时,必须要用delete[]来摧毁数组。因为auto_ptr的析构函数只对非数组类型起作用。所以数组是不能被正确摧毁的话,程序的行为是不明确的。总之,auto_ptr控制一个由new分配的单对象指针,仅此而已。

不过C++ 11标准中解决了这问题:

unique_ptr

smart pointer with unique object ownership semantics

只能有一个主人的指针,可以用于STL容器

shared_ptr

smart pointer with shared object ownership semantics

可共享的指针

weak_ptr

weak reference to an object managed by std::shared_ptr

弱引用指针

auto_ptr

smart pointer with strict object ownership semantics

只能有一个主人的指针,不能用于STL容器

走远了,想深入(不要想多了-_- ),请baidu...

看完上面之些,发现是不是觉得 各种知识又巩固了.

所以还是要看开源代码,之前公司整死不用开源的...哎...

开始

代码中主要使用类的关系

图片过宽,不能显示(请 在新标签中打开图片.谢谢.)

主要的几个类:

1,TCPServer 主服务,负责 调用select 模型,来处理 连接消息的变化.

2,PooledThread 是线程池.当被激活时,调用 TCPServerDispatcher::run() 来处理收到包后的具体请求.而 TCPServerDispatcher::run() 中调用

    TimeServerConnection.run(). TimeServerConnection.run()通过子类隐藏 来实现 程序员 自定义 功能. 不得不说写POCO的大牛利害.

3,TCPServerDispatcher,派遣管理者(先这么叫吧). 接收消息变化,放入队列.管理 连接数.

当放入队列时,会激活 PooledThread 中的事件 .

PooledThread 又反过来 激活 TCPServerDispatcher::run() [姑且叫 有条件时相互激活吧 ]

4,TCPServerConnection.实现具体行为,通过继承由子类的 run() 来自定义实现 功能.

5,TCPServerConnectionFactory 负责创建和管理 TCPServerConnection.

6,TCPServerParams 这个参数管理 ,就不说了.你懂的.

7,NotificationQueue 把 连接 放入队列.进行管理.

看完主要几个类的介绍,其它流程都应该懂大概了.

流程图:

由于图太长的关系多,

图片过宽,不能显示(请 在新标签中打开图片.谢谢.)

先看看 PooledThread 的流程吧

再看下TCPServer 主宰的流程
图片过宽,不能显示(请 在新标签中打开图片.谢谢.)

windows 下的select的确性能不太行,而linux 版本是用的epoll.

epoll相对select 要高效点.可参考:http://blog.csdn.net/legion8169/article/details/1637154

但poco tcpserver 中是有线程池操作的,所以说来效率不会太低.

先到这儿,还没有写完.

我们可以改变什么:

    ThreadPool(<span>int</span> minCapacity = <span>2</span><span>,
        </span><span>int</span> maxCapacity = <span>16</span><span>,
        </span><span>int</span> idleTime = <span>60</span><span>,
        </span><span>int</span> stackSize =<span> POCO_THREAD_STACK_SIZE);
        </span><span>///</span><span> Creates a thread pool with minCapacity threads.
        </span><span>///</span><span> If required, up to maxCapacity threads are created
        </span><span>///</span><span> a NoThreadAvailableException exception is thrown.
        </span><span>///</span><span> If a thread is running idle for more than idleTime seconds,
        </span><span>///</span><span> and more than minCapacity threads are running, the thread
        </span><span>///</span><span> is killed. Threads are created with given stack size.</span>
登入後複製

增加线程池中线程数(费话!),来加快select 中处理.

在中等程序中,增加  TCPSelect Manage进程,  来负责与多个  TcpServer 的进程通信.

即再增加一个管理者(中间键,或activemq之类),来加强并发能力,

或者直接使用linux 环境 ,即用了epoll 来实现高效性.

 

个人愚见,可能有些没写明白.还望高手指点.

谢谢.

 

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/971772.htmlTechArticle关于 Poco::TCPServer框架 (windows 下使用的是 select模型) 学习笔记.,pocotcpserver 说明 为何要写这篇文章 ,之前看过阿二的梦想船的Poco::TCPServer框...
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

小米 POCO F7 透露將在全球和印度發布專門版本 小米 POCO F7 透露將在全球和印度發布專門版本 Aug 08, 2024 pm 09:31 PM

小米似乎正在準備另一批 Redmi 和 POCO 智慧型手機,這些智慧型手機可能會在今年稍後上市。最近幾天,有證據表明該公司正在為全球受眾開發 POCO F7 Pro,並將在中國以 Redmi K8 的名稱提供

早期的小米 POCO F7 Pro 曝光揭示了與 Redmi K80 的聯繫 早期的小米 POCO F7 Pro 曝光揭示了與 Redmi K80 的聯繫 Jul 31, 2024 am 08:48 AM

POCO F6 Pro(亞馬遜售價 512.50 美元)於 5 月 23 日發布,發佈時間不長。與通常的情況一樣,該網站發現了第一個引用

8 月 1 日發布,小米 POCO M6 Plus 5G 手機以及 POCO Buds X1 耳機實物照曝光 8 月 1 日發布,小米 POCO M6 Plus 5G 手機以及 POCO Buds X1 耳機實物照曝光 Jul 30, 2024 pm 02:29 PM

7月30日消息,消息來源YogeshBrar昨天(7月29日)在X平台發布推文,分享了小米POCOM6Plus5G手機以及POCOBudsX1耳機的實體照片,兩款產品官宣將於8月1日發布。小米POCOM6Plus5G手機訊息源表示,小米POCOM6Plus5G手機將配6.8吋LCD螢幕,搭載高通驍龍4Gen2AE處理器,背面配1.08億像素攝像頭,5030mAh容量電池。先前報導,這款手機可選紫色、黑色、銀色三種配色,整體與標準版POCOM6手機大致相同,但LED閃光燈環相對更加突出。 POCOB

小米 POCO X6 Neo 手機 3 月在印度上市,POCO F6 預計 7 月上市 小米 POCO X6 Neo 手機 3 月在印度上市,POCO F6 預計 7 月上市 Feb 15, 2024 pm 02:24 PM

2月8日消息,根據@YogeshBrar爆料,POCOX6Neo將於2024年3月在印度發售,這款智慧型手機將是小米去年11月在中國推出的RedmiNote13RPro的更名版本。 Brar也補充說,POCOF6將於2024年7月在印度推出。小米去年11月直接在商城上架了RedmiNote13RPro手機,僅有的12GB+256GB版本售1,999元。該機搭載聯發科天璣6080處理器(註:原天璣810),最高主頻可達2.4GHz;內建5,000mAh電池,支援33W快充。該機還提供三種配色,厚7.73mm

小米澎湃OS國際版升級計畫正式啟動 小米澎湃OS國際版升級計畫正式啟動 Dec 19, 2023 pm 05:39 PM

小米公司宣布推出全新的小米澎湃OS,與華為鴻蒙OS不同,該作業系統將不僅適用於國內用戶,還將提供給海外用戶使用,取代原有的MIUI系統根據最新消息,小米旗下的海外品牌POCO宣布,他們的旗艦型號POCOF5將首先推出小米澎湃OS的國際版升級,而其他型號的升級計劃稍後將會公佈根據小編的了解,首批可升級至小米澎湃OS的海外機型共計11款,包括小米13T、小米13TPro、小米12T、小米11T、小米13、小米13Pro、小米13至尊紀念版、POCOF5、POCOF5Pro,以及RedmiNote12

小米 POCO Pad 5G 平板 8 月 23 日海外發布:12.1 吋 120Hz 螢幕、支援手寫筆 / 外接鍵盤 小米 POCO Pad 5G 平板 8 月 23 日海外發布:12.1 吋 120Hz 螢幕、支援手寫筆 / 外接鍵盤 Aug 16, 2024 pm 10:35 PM

本站8月16日消息,小米POCO今天在X平台官宣將在當地時間8月23日面向印度市場推出POCOPad5G版本,參考Flipkart電商平台預熱,這款平板將支援手寫筆和鍵盤,配備一塊12.1吋120Hz螢幕。小米POCO在今年5月在海外推出了標準版POCOPad,該機採用12.1吋1600x2560解析度120HzIPSLCD螢幕,搭載8GBRAM及256GB儲存空間,配備高通驍龍7sGen2處理器。由於高通驍龍7sGen2處理器支援5G通信,因此這款POCOPad5G平板電腦的SoC可能不會

小米 POCO X6 Neo 手機 3 月 13 日海外發布:天璣 6080、6.67 吋 OLED 屏 小米 POCO X6 Neo 手機 3 月 13 日海外發布:天璣 6080、6.67 吋 OLED 屏 Mar 09, 2024 pm 09:07 PM

3月9日消息,根據小米POCOX平台官方帳號,POCOX6Neo手機將於2024年3月13日發售,這款手機是小米去年11月在中國內地市場推出的RedmiNote13RPro的更名版本。整理小米RedmiNote13RPro參數資訊如下:SoC:天璣6080處理器(註:原天璣810)螢幕:6.67吋2400×1080解析度OLED柔性直屏,全域激發亮度1000nitRAM:12GB儲存空間:256GB後置相機: 108MP主攝+2MP景深前置鏡頭:16MP電池:5000毫安培時,支援33W有線快充

小米公佈了具有 5G 連接功能的新 Poco Pad 的上市日期 小米公佈了具有 5G 連接功能的新 Poco Pad 的上市日期 Aug 17, 2024 am 06:32 AM

小米宣布推出一款新的 Android 平板電腦,將以 Poco 品牌推出。它被稱為 Poco Pad 5G,該平板電腦將於 8 月 23 日在印度推出。

See all articles