這部分基本和上一節同樣,不過上一節中 RPC 是經過 Named Pipe 調用的,這裏咱們再試一下 TCP 的方式。
代碼大部分都是相同的, IDL 接口不用變(不管是經過什麼方式 RPC,接口都是與之無關的)。
服務端要換成 TCP 的方式:
- int main(int argc,char * argv[])
- {
-
- RpcServerUseProtseqEp(
- (unsigned char *)"ncacn_ip_tcp",
- RPC_C_PROTSEQ_MAX_REQS_DEFAULT,
- (unsigned char *)"13521",
- NULL);
-
-
-
-
-
-
-
- RpcServerRegisterIfEx(
- HelloWorld_v1_0_s_ifspec,
- NULL,
- NULL,
- RPC_IF_ALLOW_CALLBACKS_WITH_NO_AUTH,
- 0,
- NULL);
-
-
- ...
-
- return 0;
- }
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 開始,加強了安全性的要求,若是用 RpcServerRegisterIf() 註冊
// 接口,客戶端調用時會出現 RpcExceptionCode() == 5,即Access Denied 的錯誤. 所以,必
// 須用 RpcServerRegisterIfEx 帶 RPC_IF_ALLOW_CALLBACKS_WITH_NO_AUTH 標誌容許客戶端直
// 接調用。
// 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;
}
客戶端的調用方式也要換:
- int main(int argc, char * argv[])
- {
-
- ...
-
-
-
-
- RpcStringBindingCompose(
- NULL,
- (unsigned char*)"ncacn_ip_tcp",
- (unsigned char*)"localhost" ,
- (unsigned char*)"13521",
- NULL,
- &pszStringBinding
- );
-
-
- ...
- }
int main(int argc, char * argv[])
{
// 前面都相同
...
// 用 TCP 方式做爲 RPC 的通道。服務器端口 13521。第3個
// 參數 NetworkAddr 若是取 NULL,那麼就是鏈接本機服務,
// 也能夠取IP, 域名, servername 等
RpcStringBindingCompose(
NULL,
(unsigned char*)"ncacn_ip_tcp",
(unsigned char*)"localhost" /*NULL*/,
(unsigned char*)"13521",
NULL,
&pszStringBinding
);
// 後面都相同
...
}
別的地方都是同樣的。
示例下載