這部分基本和上一節(jié)一樣,不過(guò)上一節(jié)中 RPC 是通過(guò) Named Pipe 調(diào)用的,這里我們?cè)僭囈幌?TCP 的方式。
代碼大部分都是相同的, IDL 接口不用變(無(wú)論是通過(guò)什么方式 RPC,接口都是與之無(wú)關(guān)的)。
服務(wù)端要換成 TCP 的方式:
---------------------------------
int main(int argc,char * argv[])
{
// 用TCP 方式作為RPC 的通道。綁定端口13521。
RpcServerUseProtseqEp(
(unsigned char *)"ncacn_ip_tcp",
RPC_C_PROTSEQ_MAX_REQS_DEFAULT,
(unsigned char *)"13521",
NULL);
// 注意:從Windows XP SP2 開(kāi)始,增強(qiáng)了安全性的要求,如果用 RpcServerRegisterIf() 注冊(cè)
// 接口,客戶(hù)端調(diào)用時(shí)會(huì)出現(xiàn) RpcExceptionCode() == 5,即Access Denied 的錯(cuò)誤. 因此,必
// 須用 RpcServerRegisterIfEx 帶 RPC_IF_ALLOW_CALLBACKS_WITH_NO_AUTH 標(biāo)志允許客戶(hù)端直
// 接調(diào)用。
// RpcServerRegisterIf(HelloWorld_v1_0_s_ifspec, NULL, NULL);
RpcServerRegisterIfEx(
HelloWorld_v1_0_s_ifspec, // Interface to register.
NULL,
NULL, // Use the MIDL generated entry-point vector.
RPC_IF_ALLOW_CALLBACKS_WITH_NO_AUTH,
0,
NULL);
// 后面都相同
...
return 0;
}
客戶(hù)端的調(diào)用方式也要換:
---------------------------------
int main(int argc, char * argv[])
{
// 前面都相同
...
// 用 TCP 方式作為 RPC 的通道。服務(wù)器端口 13521。第3個(gè)
// 參數(shù) NetworkAddr 如果取 NULL,那么就是連接本機(jī)服務(wù),
// 也可以取IP, 域名, servername 等
RpcStringBindingCompose(
NULL,
(unsigned char*)"ncacn_ip_tcp",
(unsigned char*)"localhost" /*NULL*/,
(unsigned char*)"13521",
NULL,
&pszStringBinding
);
// 后面都相同
...
}
別的地方都是一樣的。
示例下載