Jadual Kandungan
关于 Poco::TCPServer框架 (windows 下使用的是 select模型) 学习笔记.,pocotcpserver
说明
关于开始前的了解:
对构造函数初始化顺序的理解
开始
代码中主要使用类的关系
主要的几个类:
流程图:
先看看 PooledThread 的流程吧
 再看下TCPServer 主宰的流程
图片过宽,不能显示(请 在新标签中打开图片.谢谢.)
Rumah pembangunan bahagian belakang tutorial 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>
Salin selepas log masuk

所以,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>
Salin selepas log masuk

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

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

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

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

 

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

谢谢.

 

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/971772.htmlTechArticle关于 Poco::TCPServer框架 (windows 下使用的是 select模型) 学习笔记.,pocotcpserver 说明 为何要写这篇文章 ,之前看过阿二的梦想船的Poco::TCPServer框...
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Penampakan awal Xiaomi POCO F7 Pro mendedahkan pautan dengan Redmi K80 Penampakan awal Xiaomi POCO F7 Pro mendedahkan pautan dengan Redmi K80 Jul 31, 2024 am 08:48 AM

POCO F6 Pro (curr. $512.50 di Amazon) tidak lama lagi dikeluarkan, telah diumumkan pada 23 Mei. Namun begitu, Gizmochina telah pun melihat penampakan awal penggantinya. Seperti yang sering berlaku, tapak web telah menemui rujukan pertama

Xiaomi POCO F7 mendedahkan untuk menerima keluaran global dan India khusus Xiaomi POCO F7 mendedahkan untuk menerima keluaran global dan India khusus Aug 08, 2024 pm 09:31 PM

Xiaomi nampaknya sedang menyediakan satu lagi pilihan telefon pintar Redmi dan POCO yang boleh bersama kami lewat tahun ini. Dalam beberapa hari kebelakangan ini, bukti bahawa syarikat itu sedang membangunkan POCO F7 Pro untuk khalayak global, yang akan ditawarkan di China sebagai Redmi K8

Dikeluarkan pada 1 Ogos, gambar fizikal telefon bimbit Xiaomi POCO M6 Plus 5G dan fon kepala POCO Buds X1 terdedah Dikeluarkan pada 1 Ogos, gambar fizikal telefon bimbit Xiaomi POCO M6 Plus 5G dan fon kepala POCO Buds X1 terdedah Jul 30, 2024 pm 02:29 PM

Menurut berita pada 30 Julai, sumber Yogesh Brar menyiarkan tweet pada platform X semalam (29 Julai), berkongsi gambar fizikal telefon bimbit Xiaomi POCOM6 Plus 5G dan fon kepala POCO Buds X1 Pengumuman rasmi kedua-dua produk itu akan dikeluarkan pada 1 Ogos. Sumber telefon bimbit 5G Xiaomi POCOM6 Plus berkata bahawa telefon bimbit Xiaomi POCOM6 Plus 5G akan dilengkapi dengan skrin LCD 6.8 inci, dilengkapi pemproses Qualcomm Snapdragon 4Gen2AE, dilengkapi dengan kamera 108 megapiksel di bahagian belakang, dan bateri berkapasiti 5030mAh. Seperti yang dilaporkan sebelum ini, telefon ini tersedia dalam tiga warna: ungu, hitam dan perak. Ia lebih kurang sama dengan telefon POCOM6 standard, tetapi cincin denyar LED agak lebih menonjol. POCOB

Telefon bimbit Xiaomi POCO X6 Neo akan dilancarkan di India pada bulan Mac, POCO F6 dijangka dilancarkan pada bulan Julai Telefon bimbit Xiaomi POCO X6 Neo akan dilancarkan di India pada bulan Mac, POCO F6 dijangka dilancarkan pada bulan Julai Feb 15, 2024 pm 02:24 PM

Menurut berita pada 8 Februari, menurut @YogeshBrar, POCOX6Neo akan dikeluarkan di India pada Mac 2024. Telefon pintar ini akan menjadi versi penjenamaan semula RedmiNote13RPro yang dilancarkan oleh Xiaomi di China pada November tahun lepas. Brar juga menambah bahawa POCOF6 akan dilancarkan di India pada Julai 2024. Xiaomi melancarkan telefon mudah alih Redmi Note 13R Pro secara langsung di pusat beli-belah November lalu, dan satu-satunya versi 12GB+256GB dijual pada harga 1,999 yuan. Mesin ini dilengkapi dengan pemproses MediaTek Dimensity 6080 (nota: Dimensity 810 asal), dengan frekuensi maksimum sehingga 2.4GHz ia mempunyai bateri terbina dalam 5000mAh dan menyokong pengecasan pantas 33W. Mesin ini juga menawarkan tiga warna dan tebal 7.73mm.

Pelan peningkatan versi antarabangsa Xiaomi ThePaper OS dilancarkan secara rasmi Pelan peningkatan versi antarabangsa Xiaomi ThePaper OS dilancarkan secara rasmi Dec 19, 2023 pm 05:39 PM

Xiaomi telah mengumumkan pelancaran Xiaomi Pascal OS baharu Berbeza dengan OS Hongmeng Huawei, sistem pengendalian ini bukan sahaja sesuai untuk pengguna domestik, tetapi juga akan diberikan kepada pengguna luar negara, menggantikan sistem MIUI yang asal. POCO jenama luar negara Xiaomi mengumumkan bahawa model perdana mereka POCOF5 akan menjadi yang pertama melancarkan peningkatan versi antarabangsa Xiaomi ThePaper OS, dan pelan naik taraf untuk model lain akan diumumkan kemudian, mengikut pemahaman editor, kumpulan pertama model luar negara yang boleh ditingkatkan kepada model 11 Xiaomi ThePaper OS , termasuk Xiaomi 13T, Xiaomi 13TPro, Xiaomi 12T, Xiaomi 11T, Xiaomi 13, Xiaomi 13Pro, Xiaomi 13 Extreme Commemorative Edition, POCOF5, POCOF5Pro dan RedmiNote12.

Tablet Xiaomi POCO Pad 5G dikeluarkan di luar negara pada 23 Ogos: Skrin 12.1 inci 120Hz, menyokong stylus/papan kekunci luaran Tablet Xiaomi POCO Pad 5G dikeluarkan di luar negara pada 23 Ogos: Skrin 12.1 inci 120Hz, menyokong stylus/papan kekunci luaran Aug 16, 2024 pm 10:35 PM

Menurut berita dari laman web ini pada 16 Ogos, Xiaomi POCO secara rasmi mengumumkan hari ini pada skrin A 12.1-inci 120Hz. Xiaomi POCO melancarkan versi standard POCO Pad di luar negara pada Mei tahun ini Mesin ini menggunakan skrin LCD 120Hz IPS beresolusi 12.1 inci 1600x2560, dilengkapi dengan 8GB RAM dan ruang storan 256GB, serta dilengkapi dengan pemproses Qualcomm Snapdragon 7sGen2. Memandangkan pemproses Qualcomm Snapdragon 7sGen2 menyokong komunikasi 5G, SoC tablet POCOPad 5G ini mungkin tidak

Telefon bimbit Xiaomi POCO X6 Neo dikeluarkan di luar negara pada 13 Mac: Dimensity 6080, skrin OLED 6.67 inci Telefon bimbit Xiaomi POCO X6 Neo dikeluarkan di luar negara pada 13 Mac: Dimensity 6080, skrin OLED 6.67 inci Mar 09, 2024 pm 09:07 PM

Menurut berita pada 9 Mac, menurut akaun rasmi platform Xiaomi POCOX, telefon mudah alih POCOX6 Neo akan dikeluarkan pada 13 Mac 2024. Telefon bimbit ini adalah versi dinamakan semula kepada Redmi Note13R Pro yang dilancarkan oleh Xiaomi di tanah besar China pasaran pada November tahun lalu. Maklumat parameter Xiaomi RedmiNote13RPro disusun seperti berikut: SoC: Pemproses Dimensity 6080 (Nota: Dimensity 810 asal) Skrin: 6.67-inci 2400×1080 resolusi Skrin lurus fleksibel OLED, kecerahan pengujaan global 1000nit RAM: 12GB Ruang storan: 8MP 256GB Kamera belakang: 256GB kamera utama + kamera hadapan medan kedalaman 2MP: Bateri 16MP: 5000 mAh, menyokong pengecasan pantas berwayar 33W

Xiaomi mendedahkan tarikh pelancaran Poco Pad baharu dengan sambungan 5G Xiaomi mendedahkan tarikh pelancaran Poco Pad baharu dengan sambungan 5G Aug 17, 2024 am 06:32 AM

Xiaomi telah mengumumkan tablet Android baharu yang akan dilancarkan di bawah penjenamaan Poco. Ia dipanggil Poco Pad 5G, dan tab itu ditetapkan untuk dilancarkan di India pada 23 Ogos. Jadual pertama yang dilancarkan di bawah jenama Poco telah didedahkan di Mayof ini ye

See all articles