ICE筆記 05 伺服器端Slice到C 對映

2021-08-30 07:55:22 字數 3168 閱讀 9650

colorado 】

本文將介紹伺服器端的slice到c++ 對映。客戶端slice到c++對映的內容也適用於伺服器端。

1、伺服器端的主要流程

service類的定義:

namespace ice ;

}service.main

⑴、分析處理引數向量

⑵、配置configureservice/configuredaemon

⑶、執行run

service.run

⑴、安裝ctrlchandler處理訊號

⑵、初始化通訊器

⑶、呼叫start

⑷、呼叫waitforshutdown

⑸、呼叫stop

⑹、銷毀通訊器

⑺、得體地終止服務

service成員函式:

handleinterrupt

訊號發生時由ctrlchandler呼叫,預設忽略訊號。

initializecommunicator

初始化通訊器,預設ice::initialize

interrupt

訊號處理器呼叫它表示收到訊號, 預設實現呼叫shutdown。

shutdown

關閉伺服器

start

啟動:引數處理,建立物件介面卡,註冊服務者……

stop

終止之前的清理

syserror,error,warning,trace,print 將訊息記錄到通訊器日誌器中。

waitforshutdown

等待服務關閉,預設實現是呼叫通訊器的waitforshutdown。

checksystem:

支援服務,返回true。

disableinterrupt

禁用訊號

enableinterrupt

啟用訊號,handleinterrupt處理

configuredaemon

configureservice

*instance

服務例項

name

服務名稱

run必須設定configuredeamon/configservice作為服務執行。

service

是服務,返回true。

日誌windows上,不設定日誌器,會記錄到系統事件日誌中。

unix上,使用ice.usesyslog指日誌器,ice.stderr將錯誤重定向到檔案。

命令列引數:

unix平台上 --daemon引數指明程式應該作為守護程式執行。

windows平台上 --service name引數指明程式作為name服務執行。

在客戶端,介面對映到**類。在伺服器端,介面對映到骨架類。骨架類是抽象類,成員函式為純虛函式,繼承自ice::object。

服務者類

服務者類繼承並實現對應的骨架類。在定義服務者類時建議總是使用虛繼承。嚴格地說,只有其實現的介面使用了多繼承的服務者才必須使用虛繼承;但virtual關鍵字並無害處,同時,如果在開發中途要給介面層次增加多繼承,無需回去給服務者類增加virtual 關鍵字。

5、引數傳遞

slice規範的操作:

string op(string sin, out string sout);

c++對映**:

virtual std::string op(const std::string &, std::string &,const ice::current & = ice::current()) = 0;

• in 引數通過值或const 引用傳遞。

• out 引數通過引用傳遞。

• 返回值通過值傳遞。

• 在slice規範中["cpp:const"]指令可以指定const成員函式。

6、異常

異常:只丟擲slice異常規範中定義的異常。

拋c++異常,客戶會收到unknownexception;

拋未在異常規範中定義的使用者異常,客戶會收到unknownuserexception;

拋ice執行時異常,客戶會收到unknownlocalexception。

7、啟用服務者

nodeptr servant = new nodei(name);

ice::identity id;

id.name = name;

myadapter->add(servant, id);

⑴. 例項化服務者類

在堆上建立nodei實現類,賦給智慧型指標servant。如果要呼叫nodei類的成員函式,應該定義nodeiptr智慧型指標:

typedef iceutil::handlenodeiptr;

nodeiptr servant = new nodei(name);

⑵. 服務者對應的ice物件建立標識

struct identity ;

通常category為空。只為name賦值。

⑶. 啟用服務者

myadapter->add(servant, id);

將代表服務者的智慧型指標servant,以及標識id新增到介面卡的服務者對映表(asm)中,從而啟用了服務者。可以接收客戶端的服務了。客戶端**包含伺服器定址資訊,請求的ice物件標識id,客戶呼叫操作時,物件標識一同發給伺服器,伺服器根據物件id查詢asm表,找到該標識的服務者,就把請求分派給它的成員函式。

myadapter->addwithuuid(servant);

未指定標識,使用uuid作為物件標識,也可以使用iceutil::generateuuid()建立全域性唯一標識,再賦給add操作。

⑷. 建立**

nodeprx proxy = nodeprx::uncheckedcast(myadapter->add(servant, id));

現在,可以將proxy傳給客戶端使用了。

ice提供了直接建立**的操作:

ice::identity id;

id.name = iceutil::generateuuid();

objectprx o = myadapter->createproxy(id);

無論物件標識id對應的服務者是否被啟用,該操作都會建立的**。

datatable 筆記 伺服器端查詢

var vtable vip data datatable ajax data,vtable vtable 自身準備的請求資料 fndrawcallback function data columns 第一列 顯示為 請求道的資料 vid id columndefs 初始化後 再次請求 vtable...

socket伺服器端

伺服器 include winsock2.h include string.h include stdio.h include time.h include stdarg.h include stdlib.h pragma comment lib,ws2 32 void errexit const ...

kerberos伺服器端

1.安裝tcl wget tar zvxf tcl8.5.12 src.tar.gz cd tcl8.5.12 cd unix configure make make install 3.解壓 tar xvf krb5 1.10.3 signed.tar tar zvxf krb5 1.10.3.t...