一个包的TcpServer流程
生活随笔
收集整理的這篇文章主要介紹了
一个包的TcpServer流程
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
上次說到對于那種有內(nèi)容的包
bool TCPServer::on_receive_data(int channel_id, void* data, int len)
{packet pkt;{pkt.data = m_memPool.popPkt(len);//從內(nèi)存池分配len大小的內(nèi)存,返回地址,此處為什么使用內(nèi)存池不太清楚
}memcpy(pkt.data, data, len);pkt.size = len;pkt.channel_id = channel_id;pkt.is_data = true;from_net_push_pkt(pkt);//放到無鎖隊列中return true;
}net啟動的時候會創(chuàng)建一個線程專門從無鎖隊列中讀包,然后放入共享內(nèi)存中
bool TCPServer::recv(packet& pkt)
{//((I_LibEvtServer*)m_spTCPServer[0].get())->run_once();
#ifdef BOOST_LOCKFREEif(m_all_packet.empty())return false;void* p = pkt.data;bool hr = m_all_packet.pop(pkt);if(!hr)return false;if(pkt.is_data){memcpy(p, pkt.data, pkt.size);//服務(wù)器有好多都是依照這個原理做的m_memPool.pushPkt(pkt.data, pkt.size);//歸還內(nèi)存池(對于這種模式,我不太懂為什么這樣,一個線程把包放入無鎖隊列中,另一個線程從無鎖隊列中讀)
}pkt.data = p;--consumer_count;return true;
}
把這兩個問題搞懂,接下來就是最難的共享內(nèi)存部分了,弄懂這個部分,廢大勁了
?
轉(zhuǎn)載于:https://www.cnblogs.com/zzyoucan/p/4082649.html
總結(jié)
以上是生活随笔為你收集整理的一个包的TcpServer流程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Cocos2d JS 之消灭星星(九)
- 下一篇: 网易有道将为微信用户提供免费外语微信翻译