在RPC中使用Unix Domain Socket
冷胜魁(Seaquester)
lengshengkui@outlook.com
2015-3-11
Linux下的RPC除了支持TCP和UDP两种通讯方式,还支持Unix Domain Socket。关于这方面的资料却不多,经过一番尝试,终于找到了正确的使用方式。下面将主要介绍和TCP/UDP方式的不同。
1. Server端
首先,需要调用svcunix_create来创建一个基于Unix Domain socket 的 RPC service transport。该函数的第一个参数sock必须是RPC_ANYSOCK,最后一个参数path是Unix Domain socket 的path(其实就是个文件路径)。
-
transp = svcunix_create(RPC_ANYSOCK, 0, 0, "/tmp/gettime_13579.sock");
-
if (transp == NULL) {
-
fprintf (stderr, "%s", "cannot create rpc(unix) service.");
-
exit(1);
-
}
然后,调用svc_register来注册,该函数最后一个参数 protocol 必须是0。
-
if (!svc_register(transp, GETTIME_PROG, GETTIME_VERSION, gettime_prog_1, 0)) {
-
printf("unable to register (GETTIME_PROG, GETTIME_VERSION, unix)\n");
-
exit(1);
-
}
2. Client端
Client需要调用 clnt_create 创建一个RPC链接。带函数的第一个参数host不再是hostname,必须设置成Unix Domain Socket的path(和Server端必须一致)。最后一个参数proto必须设置成“unix”。
-
clnt = clnt_create("/tmp/gettime_13579.sock", GETTIME_PROG, GETTIME_VERSION, "unix");
-
if (clnt == NULL) {
-
clnt_pcreateerror("clnt_create");
-
exit(1);
-
}
阅读(3045) | 评论(0) | 转发(0) |