목차
关于 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 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

초기 Xiaomi POCO F7 Pro 목격으로 Redmi K80과의 연관성이 드러났습니다. 초기 Xiaomi POCO F7 Pro 목격으로 Redmi K80과의 연관성이 드러났습니다. Jul 31, 2024 am 08:48 AM

POCO F6 Pro(Amazon에서 현재 $512.50)는 5월 23일에 발표되어 출시된 지 얼마 되지 않았습니다. 그럼에도 불구하고 Gizmochina는 이미 후속 제품을 조기에 발견했습니다. 종종 그렇듯이, 웹사이트는 다음에 대한 첫 번째 언급을 발견했습니다.

Xiaomi POCO F7은 글로벌 및 인도 전용 릴리스를 받을 것으로 밝혀졌습니다. Xiaomi POCO F7은 글로벌 및 인도 전용 릴리스를 받을 것으로 밝혀졌습니다. Aug 08, 2024 pm 09:31 PM

Xiaomi는 올해 말에 우리와 함께 할 수 있는 또 다른 Redmi 및 POCO 스마트폰을 준비할 것으로 보입니다. 최근에는 회사가 전 세계 고객을 대상으로 POCO F7 Pro를 개발하고 있다는 증거가 있으며, 이 제품은 중국에서 Redmi K8로 제공될 예정입니다.

8월 1일 공개, Xiaomi POCO M6 Plus 5G 휴대폰과 POCO Buds X1 헤드폰의 실물 사진이 노출되었습니다. 8월 1일 공개, Xiaomi POCO M6 Plus 5G 휴대폰과 POCO Buds X1 헤드폰의 실물 사진이 노출되었습니다. Jul 30, 2024 pm 02:29 PM

7월 30일 뉴스에 따르면 요게시 브라(Yogesh Brar) 소식통은 어제(29일) X 플랫폼에 샤오미 POCOM6 Plus 5G 휴대폰과 POCO Buds X1 헤드폰의 실물 사진을 공유하는 트윗을 올렸습니다. 8월 1일 샤오미 POCOM6 Plus 5G 휴대폰 소식통에 따르면 샤오미 POCOM6 Plus 5G 휴대폰에는 6.8인치 LCD 화면, Qualcomm Snapdragon 4Gen2AE 프로세서, 뒷면에 1억 800만 화소 카메라, 5030mAh 용량 배터리가 탑재될 예정입니다. 이전에 보고된 대로 이 휴대폰은 보라색, 검정색, 은색의 세 가지 색상으로 제공됩니다. 표준 POCOM6 휴대폰과 거의 동일하지만 LED 플래시 링이 상대적으로 더 눈에 띕니다. 포콥

Xiaomi POCO X6 Neo 휴대폰은 3월 인도에서 출시될 예정이며 POCO F6는 7월에 출시될 예정입니다. Xiaomi 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월 홍미노트 13R 프로 휴대폰을 쇼핑몰에 직접 출시했는데, 유일한 12GB+256GB 버전이 1,999위안에 판매됐다. 이 기기에는 최대 주파수가 2.4GHz인 MediaTek Dimensity 6080 프로세서(참고: 원래 Dimensity 810)가 장착되어 있으며 5000mAh 배터리가 내장되어 있으며 33W 고속 충전을 지원합니다. 이 기계는 또한 세 가지 색상을 제공하며 두께는 7.73mm입니다.

Xiaomi ThePaper OS 국제 버전 업그레이드 계획 공식 출시 Xiaomi ThePaper OS 국제 버전 업그레이드 계획 공식 출시 Dec 19, 2023 pm 05:39 PM

샤오미는 화웨이의 홍멍(Hongmeng) OS와 달리 새로운 샤오미 서징 OS(Xiaomi Surging OS) 출시를 발표했다. 최신 소식에 따르면 이 운영체제는 국내 사용자뿐만 아니라 해외 사용자에게도 제공될 예정이다. 샤오미의 해외 브랜드 POCO는 자사의 주력 모델인 POCOF5가 샤오미 Thermal OS의 국제 버전 업그레이드를 가장 먼저 출시할 것이라고 발표했으며, 다른 모델에 대한 업그레이드 계획은 편집자의 이해에 따르면 첫 번째 해외 모델이 발표될 것이라고 밝혔습니다. Xiaomi Thermal OS는 Xiaomi 13T, Xiaomi 13TPro, Xiaomi 12T, Xiaomi 11T, Xiaomi 13, Xiaomi 13Pro, Xiaomi 13 Extreme Commemorative Edition, POCOF5, POCOF5Pro 및 RedmiNote12를 포함하여 총 11개 모델로 업그레이드할 수 있습니다.

8월 23일 해외 출시 샤오미 POCO Pad 5G 태블릿: 12.1인치 120Hz 화면, 스타일러스/외부 키보드 지원 8월 23일 해외 출시 샤오미 POCO Pad 5G 태블릿: 12.1인치 120Hz 화면, 스타일러스/외부 키보드 지원 Aug 16, 2024 pm 10:35 PM

8월 16일 이 사이트의 뉴스에 따르면 Xiaomi POCO는 오늘 A 12.1인치 120Hz 화면을 공식적으로 발표했습니다. 샤오미 POCO는 올해 5월 해외에서 POCOPad 표준 버전을 출시했습니다. 이 기기는 12.1인치 1600x2560 해상도 120Hz IPS LCD 화면을 사용하고 8GB RAM과 256GB 저장 공간을 갖추고 있으며 Qualcomm Snapdragon 7sGen2 프로세서가 장착되어 있습니다. Qualcomm Snapdragon 7sGen2 프로세서는 5G 통신을 지원하므로 이 POCOPad 5G 태블릿의 SoC는

샤오미 POCO X6 네오 휴대폰, 3월 13일 해외 출시 : Dimensity 6080, 6.67인치 OLED 화면 샤오미 POCO X6 네오 휴대폰, 3월 13일 해외 출시 : Dimensity 6080, 6.67인치 OLED 화면 Mar 09, 2024 pm 09:07 PM

3월 9일 뉴스에 따르면 Xiaomi POCOX 플랫폼 공식 계정에 따르면 POCOX6 Neo 휴대폰은 2024년 3월 13일에 출시될 예정입니다. 이 휴대폰은 Xiaomi가 중국 본토에서 출시한 Redmi Note13R Pro의 이름이 변경된 버전입니다. 지난해 11월 시장. Xiaomi RedmiNote13RPro 매개변수 정보는 다음과 같이 컴파일됩니다. SoC: Dimensity 6080 프로세서(참고: 원래 Dimensity 810) 화면: 6.67인치 2400×1080 해상도 OLED 유연한 직선 화면, 글로벌 여기 밝기 1000nit RAM: 12GB 저장 공간: 256GB 후면 카메라: 108MP 메인 카메라 + 2MP 피사계 심도 전면 카메라: 16MP 배터리: 5000mAh, 33W 유선 고속 충전 지원

Xiaomi, 5G 연결성을 갖춘 새로운 Poco Pad 출시일 공개 Xiaomi, 5G 연결성을 갖춘 새로운 Poco Pad 출시일 공개 Aug 17, 2024 am 06:32 AM

샤오미(Xiaomi)가 포코(Poco) 브랜드로 출시될 새로운 안드로이드 태블릿을 발표했습니다. 이름은 Poco Pad 5G이며, 이 탭은 8월 23일 인도에서 출시될 예정입니다. Poco 브랜드로 출시된 최초의 테이블은 올해 5월에 공개되었습니다.

See all articles