RCF框架研究

Remote Call Framework (RCF) 是一個(gè)很好用的ipc通信框架颅筋。

但在使用時(shí)有以下注意事項(xiàng):

  • 參加通信的程序可以是win64和win32混合,但不能是Unicode 和Ansii混合呛牲,否則可能無(wú)法收到函數(shù)調(diào)用(應(yīng)該是跟字符串參數(shù)有關(guān))。
  • RCF::RcfInit 雖然在示例代碼中全局只初使化一次驮配。但如果是dll中娘扩,這個(gè)初使化就很講究了。
    • 不能作為全局變量壮锻,因?yàn)樗鼉?nèi)部會(huì)開啟一個(gè)新線程并且等線程啟動(dòng)成功琐旁,而dll被加載時(shí)無(wú)法等待另一個(gè)線程。(卡住的調(diào)用堆棧見下圖)
    • Rcf作為靜態(tài)庫(kù)被主進(jìn)程和DLL模塊同時(shí)引用時(shí)猜绣,主程序中的init對(duì)子進(jìn)程無(wú)效灰殴。
    • Rcf作為共享庫(kù)被主進(jìn)程和DLL模塊同時(shí)引用時(shí),主程序中的init對(duì)子進(jìn)程生效途事。
    • Rcf作為靜態(tài)庫(kù)被DLL模塊引用時(shí)验懊,在A線程中初使化擅羞,B線程中創(chuàng)建的訂閱也能接收到消息尸变。
    • Rcf作為共享庫(kù)被DLL模塊引用時(shí),在A線程中初使化减俏,B線程中創(chuàng)建的訂閱也能接收到消息召烂。
卡住的調(diào)用堆棧

管理員和普通進(jìn)程通信時(shí)權(quán)限

如果是使用tcp等網(wǎng)絡(luò)模式通信,在管理員和普通進(jìn)程之間通信并沒有什么問題娃承。但是如果是使用命名管道的模式在管理員和普通進(jìn)程之間通信奏夫,就需要設(shè)置合適的權(quán)限怕篷,否則非管理員權(quán)限的進(jìn)程打不開管理員權(quán)限的進(jìn)程創(chuàng)建的命名管道。

 // 設(shè)置權(quán)限酗昼,使非管理員權(quán)限的程序能連接上來(lái)
    {
        auto& transport = m_server->getServerTransport();
        if (transport.getTransportType() == RCF::TransportType::Tt_Win32NamedPipe)
        {
            auto& win32NamedPipeTransport = dynamic_cast<RCF::Win32NamedPipeServerTransport&>(transport);
            win32NamedPipeTransport.setSecurityAttributes(CreateEveryoneACL());
        }
    }

日志

Init之后廊谓, 使用RCF::enableLogging(); 開啟日志。
如果想修改level麻削,可以使用:RCF::LogManager::instance().DefaultLoggerPtr->setLevel(RCF::LogLevel_4);
或者新建Logger添加到 RCF::LogManager::instance()中蒸痹。

callback

RCF所能支持的callback的文檔很有限。

server.setOnCallbackConnectionCreated

    server.setOnCallbackConnectionCreated([](auto, auto) {
        std::cout << "OnCallbackConnectionCreated" << std::endl;
        });

本來(lái)以為這個(gè)是RcfServer端接收到新連接后會(huì)調(diào)用呛哟,但實(shí)測(cè)這段代碼不會(huì)被觸發(fā)叠荠,查閱代碼起來(lái)跟 RCF::createCallbackConnection()相關(guān),但是也沒有中斷到代碼扫责。
這個(gè)回調(diào)的第一個(gè)參數(shù)是RcfSessionPtr榛鼎,第二個(gè)是ClientTransportUniquePtr。但ClientTransportUniquePtr僅在作為客戶端時(shí)才會(huì)創(chuàng)建(在ClientStub::instantiateTransport中使用mEndpoint->createClientTransport()觸發(fā))鳖孤。而RcfSession是在作為服務(wù)器時(shí)會(huì)創(chuàng)建者娱,在AsioNetworkSession::onAcceptCompleted中由代碼mTransport.getSessionManager().createSession() 創(chuàng)建。

再仔細(xì)看代碼可能跟ProxyEndpoint模式有關(guān)苏揣,在這種情況下會(huì)有client和session的轉(zhuǎn)換肺然,但我不需要,不繼續(xù)深究了腿准,初使化運(yùn)作就放在第一個(gè)被調(diào)用的函數(shù)內(nèi)就行了际起。

訂閱者回調(diào)

在項(xiàng)目中需要添加訂閱端連接斷開時(shí)回調(diào),使用以下代碼:

subscriptionPtr->getRcfSessionPtr()->setOnDestroyCallback([weakThis](auto& session)
        {
            FW_DEBUG(_T("[GameCore] 訂閱連接已斷開."));
            if (const auto pThis = weakThis.lock())
            {
                pThis->m_impl->m_needReconnect = true;
            }
        });
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末吐葱,一起剝皮案震驚了整個(gè)濱河市街望,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌弟跑,老刑警劉巖灾前,帶你破解...
    沈念sama閱讀 219,589評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異孟辑,居然都是意外死亡哎甲,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門饲嗽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)炭玫,“玉大人,你說(shuō)我怎么就攤上這事貌虾⊥碳樱” “怎么了?”我有些...
    開封第一講書人閱讀 165,933評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)衔憨。 經(jīng)常有香客問我叶圃,道長(zhǎng),這世上最難降的妖魔是什么践图? 我笑而不...
    開封第一講書人閱讀 58,976評(píng)論 1 295
  • 正文 為了忘掉前任掺冠,我火速辦了婚禮,結(jié)果婚禮上码党,老公的妹妹穿的比我還像新娘赫舒。我一直安慰自己,他們只是感情好闽瓢,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評(píng)論 6 393
  • 文/花漫 我一把揭開白布接癌。 她就那樣靜靜地躺著,像睡著了一般扣讼。 火紅的嫁衣襯著肌膚如雪缺猛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,775評(píng)論 1 307
  • 那天椭符,我揣著相機(jī)與錄音荔燎,去河邊找鬼。 笑死销钝,一個(gè)胖子當(dāng)著我的面吹牛有咨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蒸健,決...
    沈念sama閱讀 40,474評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼座享,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了似忧?” 一聲冷哼從身側(cè)響起渣叛,我...
    開封第一講書人閱讀 39,359評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎盯捌,沒想到半個(gè)月后淳衙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,854評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡饺著,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評(píng)論 3 338
  • 正文 我和宋清朗相戀三年箫攀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片幼衰。...
    茶點(diǎn)故事閱讀 40,146評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡靴跛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出塑顺,到底是詐尸還是另有隱情汤求,我是刑警寧澤俏险,帶...
    沈念sama閱讀 35,826評(píng)論 5 346
  • 正文 年R本政府宣布严拒,位于F島的核電站扬绪,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏裤唠。R本人自食惡果不足惜挤牛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望种蘸。 院中可真熱鬧墓赴,春花似錦、人聲如沸航瞭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)刊侯。三九已至章办,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間滨彻,已是汗流浹背藕届。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留亭饵,地道東北人休偶。 一個(gè)月前我還...
    沈念sama閱讀 48,420評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像辜羊,于是被迫代替她去往敵國(guó)和親踏兜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評(píng)論 2 356

推薦閱讀更多精彩內(nèi)容