C ++中的远程过程调用(RPC):当端点被硬编码时,多个客户端可以监听一个服务器吗?

Posted

技术标签:

【中文标题】C ++中的远程过程调用(RPC):当端点被硬编码时,多个客户端可以监听一个服务器吗?【英文标题】:Remote Procedure Call (RPC) in C++: Can multiple Clients listen to one server when endpoint is hard coded? 【发布时间】:2017-08-29 14:02:39 【问题描述】:

我正在使用MIDLRPC 编写一个简单的服务器客户端来允许文件传输。 它在端点被硬编码时起作用,如下所示:

服务器端

status = RpcServerUseProtseqEp(  
    reinterpret_cast<unsigned char*>("ncacn_ip_tcp"), 
    RPC_C_PROTSEQ_MAX_REQS_DEFAULT,                   
    reinterpret_cast<unsigned char*>("8888"),         
    NULL);                                            

客户端

status = RpcStringBindingCompose(NULL,
    "ncacn_ip_tcp",
    (RPC_CSTR)"127.0.0.1", 
    "8888",
    NULL,
    NULL);

我想知道当端点被硬编码时,多个客户端是否能够连接到一台服务器?众所周知,在使用 TCP 协议的套接字编程中,两个应用程序不能同时连接到一个端口。但是,MSDN 引用说RPC 服务器进程使用先进先出的调用队列来处理请求。

如果无法接收来自客户端的多个请求,有没有办法设置端点池?谢谢。

【问题讨论】:

服务器通常会监听客户端的请求。你想检查这个短语吗? 【参考方案1】:

您在这里混淆了术语。

服务器 正在侦听 TCP 端口。这意味着它绑定到端口并在其上启动接受循环。每次有新的客户端连接到这个端口,accept函数就会与那个客户端建立一个TCP连接,然后返回监听这个端口。

服务器应用程序是多线程或异步应用程序,可同时处理多个操作:侦听新客户端、与每个连接的客户端通信并执行实际工作。

典型的 RPC 服务器看起来像

status = RpcServerUseProtseqEp(pszProtocolSequence,
                               RPC_C_LISTEN_MAX_CALLS_DEFAULT,
                               pszEndpoint,
                               pszSecurity); 

if (status) exit(status);

status = RpcServerRegisterIf(my_rpc_interface_spec,  
                             NULL,   
                             NULL); 

if (status) exit(status);

status = RpcServerListen(cMinCalls,
                         RPC_C_LISTEN_MAX_CALLS_DEFAULT,
                         0);

if (status) exit(status);

RpcServerListen 调用将永远阻塞,启动cMinCalls 工作线程并执行accept 循环,接受连接并在最多cMinCalls 并行线程中处理请求。

【讨论】:

以上是关于C ++中的远程过程调用(RPC):当端点被硬编码时,多个客户端可以监听一个服务器吗?的主要内容,如果未能解决你的问题,请参考以下文章

架构师之路 — 分布式系统 — RPC 远程过程调用

架构师之路 — 分布式系统 — RPC 远程过程调用

早鸟报名:深入理解Linux RPC - 从Linux RPC到Android Binder

RPC调用链通信方法

RPC调用链通信方法

深入理解Linux RPC - 从Linux RPC到Android Binder