关于 Poco::TCPServer框架 (windows 下使用的是 select模型) 学习笔记.,pocotcpserver_PHP教程
关于 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
//reinterpret_cas 这个转换是最“不安全”的,两个没有任何关系的类指针之间转换都可以用这个转换实现,举个例子
_threadId = static_cast
//static_cast 用于基本的数据类型转换(char,int),及指针之间的转换
9,关于智能(灵巧)指针auto_ptr.
auto_ptr 简单点说,就是 保证创建的资源 在退出时能被free(无论有没有异常)
std::auto_ptr
AutoPtr
可以直接 在
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
记住不管什么时候使用数组的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 来实现高效性.
个人愚见,可能有些没写明白.还望高手指点.
谢谢.

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

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

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

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

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

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

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

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

뜨거운 주제











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

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

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 플래시 링이 상대적으로 더 눈에 띕니다. 포콥

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입니다.

샤오미는 화웨이의 홍멍(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월 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는

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