这是我对它的理解:
.x 文件定义了服务器和客户端共享的接口和参数。当您使用 rpcgen 编译它时,它会生成 .h、_xdr.c、_clnt.c 和 _svc.c。_clnt.c 是存根,_svc.c 是骨架,对吧?
我知道他们是两者之间的沟通的中间人,但怎么会呢?此外,我看到运行的示例让您指定要连接的机器的 IP 地址(在示例中它使用相同的 IP 地址,127.0.0.1),但您没有指定端口。它有保留端口吗?
这是我对它的理解:
.x 文件定义了服务器和客户端共享的接口和参数。当您使用 rpcgen 编译它时,它会生成 .h、_xdr.c、_clnt.c 和 _svc.c。_clnt.c 是存根,_svc.c 是骨架,对吧?
我知道他们是两者之间的沟通的中间人,但怎么会呢?此外,我看到运行的示例让您指定要连接的机器的 IP 地址(在示例中它使用相同的 IP 地址,127.0.0.1),但您没有指定端口。它有保留端口吗?
该程序有两个步骤。有一个端口映射器在端口 111 上运行,一个 RPC 服务通过该服务注册并被该服务发现,但它本身可能在任意端口上运行。
有关详细信息,请参阅RFC 1833 - ONC RPC 版本 2 的绑定协议。
在 RPC 服务器机器上,有一个名为端点映射器的进程正在运行(这特别适用于 ONC RPC,但其他 RPC 机制将类似)。此过程在已知端口上运行,因此任何人都可以连接到它(当然,安全性和存在性允许)。
RPC 服务器将启动并向端点映射器注册自己,提供其代码(例如,MULT)和端口号,端点映射器将尽职地存储该信息以供以后使用:
+---------+ +--------+
| Mapper, | <- Register MULT, port Y -- | Server |
| known | | for |
| port X | | MULT |
+---------+ +--------+
当客户端随后使用 IP 地址连接到端点映射器时,它会提供所需的代码 (MULT),然后端点映射器会提供最终目的地 - 现在客户端知道MULT 服务的 IP 地址和端口:
+--------+ +---------+
| Client | -- Request MULT -> | Mapper, |
| | <- Return port Y -- | known |
| | | port X |
+--------+ +---------+
此时,端点映射器可以让开,让客户端直接打开与 MULT 服务本身的会话。
+--------+ +--------+
| Client | -- Connect to MULT -> | Server |
| | <- Do stuff -> | for |
| | | MULT |
+--------+ +--------+