在RPC中使用Unix Domain Socket

3200阅读 0评论2015-03-11 seaquester
分类:LINUX

在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(其实就是个文件路径)。

点击(此处)折叠或打开

  1. transp = svcunix_create(RPC_ANYSOCK, 0, 0, "/tmp/gettime_13579.sock");
  2. if (transp == NULL) {
  3.     fprintf (stderr, "%s", "cannot create rpc(unix) service.");
  4.     exit(1);
  5. }

然后,调用svc_register来注册,该函数最后一个参数 protocol 必须是0。

点击(此处)折叠或打开

  1. if (!svc_register(transp, GETTIME_PROG, GETTIME_VERSION, gettime_prog_1, 0)) {
  2.     printf("unable to register (GETTIME_PROG, GETTIME_VERSION, unix)\n");
  3.     exit(1);
  4. }

2. Client端

Client需要调用 clnt_create 创建一个RPC链接。带函数的第一个参数host不再是hostname,必须设置成Unix Domain Socket的path(和Server端必须一致)。最后一个参数proto必须设置成“unix”。

点击(此处)折叠或打开

  1. clnt = clnt_create("/tmp/gettime_13579.sock", GETTIME_PROG, GETTIME_VERSION, "unix");
  2. if (clnt == NULL) {
  3.     clnt_pcreateerror("clnt_create");
  4.     exit(1);
  5. }



上一篇:使用snmptrap发送SNMP trap
下一篇:在Linux启动时加载内核模块