ONC RPC编程——返回时间

原创 2013年12月06日 11:32:19
test.x
program TESTPROG {
   version VERSION {
     string TEST(string) = 1;
   } = 1;
} = 87654321;

87654321是RPC程序编号,还有VERSION版本号为1,都是给RPC服务程序用的。同时指定程序接受一个字符串参数。

(1).rpcgen test.x

将生成三个源文件:
test_clnt.c  test.h  test_svc.c

 

(2).rpcgen -Sc -o test_clnt_func.c test.x

生成一个客户端源文件test_clnt_func.c: 


(3).rpcgen -Ss -o test_srv_func.c test.x

 生成服务端源文件test_srv_func.c:


 (4)至此,我们就可以编译生成程序来运行了。

用下面的命令编译生成服务端程序test_server:
gcc -Wall -o test_server test_clnt.c test_srv_func.c test_svc.c

用下面的命令编译生成客户端程序test_client:
gcc -Wall -o test_client test_clnt_func.c test_clnt.c


test_srv_func.c 

/*
* This is sample code generated by rpcgen.
* These are only templates and you can use them
* as a guideline for developing your own functions.
http://jiaogen.com
*/
#include <time.h>
#include "test.h"   
char **
test_1_svc(char **argp, struct svc_req *rqstp)
{
        static char * result;
        static char tmp_char[128];
        time_t rawtime;
        /*
         * insert server code here
         */
        if( time(&rawtime) == ((time_t)-1) ) {
                strcpy(tmp_char, "Error");
                result = tmp_char;
                return &result;
        }
        sprintf(tmp_char, "服务器当前时间是 :%s", ctime(&rawtime));
        result = tmp_char;
        return &result;
}

test_clnt_func.c

/*
 * This is sample code generated by rpcgen.
 * These are only templates and you can use them
 * as a guideline for developing your own functions.
 */

#include "test.h"


void
testprog_1(char *host)
{
        CLIENT *clnt;
        char * *result_1;
        char * test_1_arg;
        test_1_arg = (char *)malloc(128);
#ifndef DEBUG
        clnt = clnt_create (host, TESTPROG, VERSION, "udp");
        if (clnt == NULL) {
                clnt_pcreateerror (host);
                exit (1);
        }
#endif  /* DEBUG */
        result_1 = test_1(&test_1_arg, clnt);
        if (result_1 == (char **) NULL) {
                clnt_perror (clnt, "call failed");
        }
        if (strcmp(*result_1, "Error") == 0) {
                fprintf(stderr, "%s: could not get the time\n", host);
                exit(1);
        }
        printf("收到消息 ... %s\n", *result_1);
#ifndef DEBUG
        clnt_destroy (clnt);
#endif   /* DEBUG */
}

int
main (int argc, char *argv[])
{
	char *host;

	if (argc < 2) {
		printf ("usage: %s server_host\n", argv[0]);
		exit (1);
	}
	host = argv[1];
	testprog_1 (host);
exit (0);
}

启动服务端程序后运行客户端程序如下:
./test_client 127.0.0.1
收到消息 ... 


问题:

(1)

服务器无法启动,错误如下:
Cannot register service: RPC: Unable to receive; errno = Connection refused
unable to register (TESTPROG, VERSION, udp).
解决方法:系统没有安装portmap或者没有启动portmap端口映射。
$ls /etc/init.d/    
如果没有portmap则安装之
    $sudo apt-get install portmap
如果有了,则启动
    $sudo /etc/init.d/portmap start
还可以使用chkconfig设置系统开机启动的服务项,如将portmap加入开机启动:
    $sudo chkconfig --level 2 -s portmap on


(2)服务器启动依旧有问题,错误如下:

Cannot register service: RPC: Authentication error; why = Client credential too weak 

unable to register (X_PROG, X_VERS, udp)

解决方法:

i).sudo -i  service portmap stop

ii).sudo  -i rpcbind -i -w

iii).sudo -i service portmap start

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

onc rpc for windows

  • 2008-03-11 12:53
  • 4.74MB
  • 下载

onc/rpc源代码

  • 2011-05-24 23:24
  • 4.74MB
  • 下载

《UNIX网络编程》第一章——一个简单的时间获取客户端/服务器程序

该程序为《UNIX网络编程》第一卷中第一章出现的程序, 该程序经过本人测试通过。 操作系统:CentOS 7 编译器:GCC 时间获取的服务器程序如下:   #include ...

ONC RPC for windows

  • 2012-11-27 21:43
  • 4.74MB
  • 下载

Unix网络编程:从入门到放弃——一个简单的时间获取程序

《Unix网络编程》两卷备受赞誉,另外四本传世经典《TCP/IP详解》(3卷)和《Unix环境高级编程》更是让W.Richard Stevens如同神一般的存在。最近入手了其中两本《Unix网络编程》...

零基础学习JAVA编程题——时间换算

题目内容: UTC是世界协调时,BJT是北京时间,UTC时间相当于BJT减去8。现在,你的程序要读入一个整数,表示BJT的时和分。整数的个位和十位表示分,百位和千位表示小时。如果小时小于10,则没有...

木头骑士的Linux编程实验室(一)——时间、错误、限制

Linux上层软件编程,除了一门必须的编程语言,比如C语言,还需要了解的,就是Linux的编程环境了。这里最常打交道的就是Linux的各种系统调用了。这里会涉及到Linux以及其先祖——UNIX的各种...

Linux下C语言编程——时间表示

1.时间表示 头文件:#include 函数: time_t time(time_t *tloc); char *ctime(const time_t *clock); time函数...

Linux下C语言编程——时间表示

1.时间表示 头文件:#include 函数:time_t time(time_t *tloc); char *ctime(const time_t *clock); time函数返回1...

C++编程实例——实现简单的时间加减运算

C++是面向对象的程序语言,区别我们的C语言,具体编程首先要定义一个类,类中包含私有成员以及公有成员两部分,私有成员主要是变量,公有成员主要是方法,另外还需要另外的.cpp程序来实现这些公有方法,以及...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)