使用rpcgen时,调用者如何找到被调用者?

Posted

技术标签:

【中文标题】使用rpcgen时,调用者如何找到被调用者?【英文标题】:When you're using rpcgen, how does the caller find the callee? 【发布时间】:2009-03-23 21:53:47 【问题描述】:

这是我对它的理解:

.x 文件定义了服务器和客户端共享的接口和参数。当你用 rpcgen 编译它时,它会生成 .h、_xdr.c、_clnt.c 和 _svc.c。 _clnt.c 是存根,_svc.c 是骨架,对吧?

我知道他们是两者之间的沟通媒介,但如何呢?此外,我看到运行的示例让您指定要连接的机器的 IP 地址(在示例中它使用相同的 IP 地址,127.0.0.1),但您没有指定端口。它有保留端口吗?

【问题讨论】:

【参考方案1】:

该过程有两个步骤。有一个端口映射器在端口 111 上运行,并且 RPC 服务通过该服务注册并被该服务发现,但它本身可能在任意端口上运行。

详情请见RFC 1833 - Binding Protocols for ONC RPC Version 2。

【讨论】:

【参考方案2】:

在 RPC 服务器机器上,有一个名为端点映射器的进程正在运行(这特别适用于 ONC RPC,但其他 RPC 机制将类似)。这个过程在一个已知端口上运行,所以任何人都可以连接到它(当然是安全和存在允许的)。

一个 RPC 服务器将启动并向端点映射器注册自己,提供其代码(例如,MULT)和端口号,端点映射器将尽职尽责地存储该信息以供以后使用:

+---------+                             +--------+
| Mapper, | <- Register MULT, port Y -- | Server |
| known   |                             | for    |
| port X  |                             | MULT   |
+---------+                             +--------+

当客户端随后使用 IP 地址连接到 endpoint mapper 时,它会提供所需的代码 (MULT),然后端点映射器会提供最终目的地 - 现在客户端知道 IP 地址 MULT 服务的端口:

+--------+                     +---------+
| Client | -- Request MULT  -> | Mapper, |
|        | <- Return port Y -- | known   |
|        |                     | port X  |
+--------+                     +---------+

此时,端点映射器可以让开,让客户端直接打开与 MULT 服务本身的会话。

+--------+                       +--------+
| Client | -- Connect to MULT -> | Server |
|        | <-     Do stuff    -> | for    |
|        |                       | MULT   |
+--------+                       +--------+

【讨论】:

以上是关于使用rpcgen时,调用者如何找到被调用者?的主要内容,如果未能解决你的问题,请参考以下文章

被调用者分配被调用者释放

使用引用调用时被调用者和调用者的值

如何将右值引用从调用者传递给被调用者

GNU gcc/ld - 使用在同一个目标文件中定义的调用者和被调用者包装对符号的调用

rdi 和 rsi 调用者保存还是被调用者保存的寄存器?

关于同步,异步,阻塞,非阻塞