CN109240834A - 一种优化方法、计算机设备和存储介质 - Google Patents

一种优化方法、计算机设备和存储介质 Download PDF

Info

Publication number
CN109240834A
CN109240834A CN201810750601.2A CN201810750601A CN109240834A CN 109240834 A CN109240834 A CN 109240834A CN 201810750601 A CN201810750601 A CN 201810750601A CN 109240834 A CN109240834 A CN 109240834A
Authority
CN
China
Prior art keywords
remote procedure
call
parameter
upgrade version
attribute
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CN201810750601.2A
Other languages
English (en)
Other versions
CN109240834B (zh
Inventor
杨亮
陈少杰
张文明
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Wuhan Douyu Network Technology Co Ltd
Original Assignee
Wuhan Douyu Network Technology Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Wuhan Douyu Network Technology Co Ltd filed Critical Wuhan Douyu Network Technology Co Ltd
Priority to CN201810750601.2A priority Critical patent/CN109240834B/zh
Publication of CN109240834A publication Critical patent/CN109240834A/zh
Application granted granted Critical
Publication of CN109240834B publication Critical patent/CN109240834B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/54Interprogram communication
    • G06F9/547Remote procedure calls [RPC]; Web services
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2209/00Indexing scheme relating to G06F9/00
    • G06F2209/54Indexing scheme relating to G06F9/54
    • G06F2209/544Remote

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Telephonic Communication Services (AREA)
  • Stored Programmes (AREA)

Abstract

本发明提供了一种优化方法,包括:基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法,在所述升级版的远程过程调用方法中,改用C语言的函数指针方式设置回调函数,并通过RpcAttribute属性方式设置参数;从所述通过RpcAttribute属性方式设置的参数中获取需要的参数并调用所述原远程过程调用方法来实现所述升级版的远程过程调用方法。通过改用C语言的函数指针方式设置回调函数来优化RPC方法,解决了现有技术中,由于不同版本的编译器对C++函数对象的内存布局大小可能不一致,从而可能导致程序崩溃的问题。

Description

一种优化方法、计算机设备和存储介质
技术领域
本发明属于计算机技术领域,尤其涉及一种优化方法、计算机设备和存储介质。
背景技术
所谓远程过程调用(RPC,Remote Procedure Call),就是一个进程调用另外一个进程所提供的方法,但是在调用端的角度仍然跟调用本进程的函数是一致的。在远程过程调用中,将要提供给被调用端进程的所有参数序列化为一个网络消息,然后通过网络传输发送到被调用端进程中。被调用端处理完成相应的服务后,将产生的结果也序列化成一个网络消息,发送到调用端进程。
在远程过程调用实现中,一些远程过程调用方法会用到函数对象,当函数对象为std标准库中的function类型时,由于function为C++模板类,故该函数对象为C++函数对象,然而,由于不同版本的编译器对C++函数对象的内存布局大小可能不一致,从而可能导致程序的崩溃。
发明内容
本申请实施例通过提供一种优化方法、计算机设备和存储介质,通过改用C语言的函数指针方式设置回调函数来优化RPC方法,解决了现有技术中,由于不同版本的编译器对C++函数对象的内存布局大小可能不一致,从而可能导致程序崩溃的问题。
第一方面,本申请通过本申请的一实施例提供如下技术方案:
一种优化方法,所述方法包括:
基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法,在所述升级版的远程过程调用方法中,改用C语言的函数指针方式设置回调函数,并通过RpcAttribute属性方式设置参数;
其中,所述基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法包括:基于原远程过程调用的注册方法设置升级版的远程过程调用的注册方法和基于原远程过程调用的调用方法设置升级版的远程过程调用的调用方法,所述升级版的远程过程调用的注册方法的参数包括远程过程调用实例句柄和int64类型的第一属性数组,所述升级版的远程过程调用的调用方法的参数包括远程过程调用实例句柄、要发送的远端程序、远程过程调用服务名称、远程过程调用的参数、参数个数和int64类型的第二属性数组,所述第一属性数组和所述第二属性数组以RPC_ATTR_END属性结尾;
从所述通过RpcAttribute属性方式设置的参数中获取需要的参数并调用所述原远程过程调用方法来实现所述升级版的远程过程调用方法。
可选的,在所述升级版的远程过程调用的注册方法中,所述第一属性数组用于按照以所述RpcAttribute属性为关键字的键值对的方式存储第一回调函数、远程过程调用服务名称、参数签名和第一自定义参数,所述第一回调函数的参数包括远程过程调用服务的远端标识、远程过程调用的参数、参数个数、远程过程调用服务执行的上下文环境和所述第一自定义参数。
可选的,在所述升级版的远程过程调用的注册方法中,所述从所述通过RpcAttribute属性方式设置的参数中获取需要的参数并调用所述原远程过程调用方法来实现所述升级版的远程过程调用方法,包括:
根据所述RpcAttribute属性的关键字的值从所述第一属性数组中获取所述远程过程调用服务名称、所述第一回调函数,所述第一自定义参数和所述参数签名;
调用std::bind函数,将所述第一回调函数和所述第一自定义参数绑定为第一C++函数对象;
根据所述远程过程调用服务名称、所述参数签名和所述第一C++函数对象,调用所述原远程过程调用的注册方法来实现所述升级版的远程过程调用的注册方法。
可选的,在所述升级版的远程过程调用的调用方法中,所述第二属性数组用于按照以所述RpcAttribute属性为关键字的键值对的方式存储第二回调函数、超时时间和第二自定义参数,所述第二回调函数的参数包括所述远程过程调用的参数和所述第二自定义参数。
可选的,在所述升级版的远程过程调用的调用方法中,所述从所述通过RpcAttribute属性方式设置的参数中获取需要的参数并调用所述原远程过程调用方法来实现所述升级版的远程过程调用方法,包括:
根据所述RpcAttribute属性的关键字的值从所述第二属性数组中获取所述所述超时时间、所述第二回调函数和所述第二自定义参数;
从所述升级版的远程过程调用的调用方法的参数列表中获取所述要发送的远端程序、所述远程过程调用服务名称、所述远程过程调用的参数、所述参数个数;
调用std::bind函数,将所述第二回调函数和所述第二自定义参数绑定为第二C++函数对象;
根据所述要发送的远端程序、所述远程过程调用服务名称、所述远程过程调用的参数、所述参数个数、所述超时时间和所述第二C++函数对象,调用所述原远程过程调用的调用方法,实现所述升级版的远程过程调用的调用方法。
第二方面,本申请通过本申请的一实施例提供如下技术方案:
一种优化装置,所述装置包括:
设置单元,用于基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法,在所述升级版的远程过程调用方法中,改用C语言的函数指针方式设置回调函数,并通过RpcAttribute属性方式设置参数;其中,所述基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法包括:基于原远程过程调用的注册方法设置升级版的远程过程调用的注册方法和基于原远程过程调用的调用方法设置升级版的远程过程调用的调用方法,所述升级版的远程过程调用的注册方法的参数包括远程过程调用实例句柄和int64类型的第一属性数组,所述升级版的远程过程调用的调用方法的参数包括远程过程调用实例句柄、要发送的远端程序、远程过程调用服务名称、远程过程调用的参数、参数个数和int64类型的第二属性数组,所述第一属性数组和所述第二属性数组以RPC_ATTR_END属性结尾;
实现单元,用于从所述通过RpcAttribute属性方式设置的参数中获取需要的参数并调用所述原远程过程调用方法来实现所述升级版的远程过程调用方法。
可选的,在所述升级版的远程过程调用的注册方法中,所述第一属性数组用于按照以所述RpcAttribute属性为关键字的键值对的方式存储第一回调函数、远程过程调用服务名称、参数签名和第一自定义参数,所述第一回调函数的参数包括远程过程调用服务的远端标识、远程过程调用的参数、参数个数、远程过程调用服务执行的上下文环境和所述第一自定义参数。
可选的,在所述升级版的远程过程调用的调用方法中,所述第二属性数组用于按照以所述RpcAttribute属性为关键字的键值对的方式存储第二回调函数、超时时间和第二自定义参数,所述第二回调函数的参数包括所述远程过程调用的参数和所述第二自定义参数。
第三方面,本申请通过本申请的一实施例提供如下技术方案:
一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现以下步骤:
基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法,在所述升级版的远程过程调用方法中,改用C语言的函数指针方式设置回调函数,并通过RpcAttribute属性方式设置参数;
其中,所述基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法包括:基于原远程过程调用的注册方法设置升级版的远程过程调用的注册方法和基于原远程过程调用的调用方法设置升级版的远程过程调用的调用方法,所述升级版的远程过程调用的注册方法的参数包括远程过程调用实例句柄和int64类型的第一属性数组,所述升级版的远程过程调用的调用方法的参数包括远程过程调用实例句柄、要发送的远端程序、远程过程调用服务名称、远程过程调用的参数、参数个数和int64类型的第二属性数组,所述第一属性数组和所述第二属性数组以RPC_ATTR_END属性结尾;
从所述通过RpcAttribute属性方式设置的参数中获取需要的参数并调用所述原远程过程调用方法来实现所述升级版的远程过程调用方法。
第四方面,本申请通过本申请的一实施例提供如下技术方案:
一种计算机设备,包括处理器、存储器以及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现以下步骤:
基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法,在所述升级版的远程过程调用方法中,改用C语言的函数指针方式设置回调函数,并通过RpcAttribute属性方式设置参数;
其中,所述基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法包括:基于原远程过程调用的注册方法设置升级版的远程过程调用的注册方法和基于原远程过程调用的调用方法设置升级版的远程过程调用的调用方法,所述升级版的远程过程调用的注册方法的参数包括远程过程调用实例句柄和int64类型的第一属性数组,所述升级版的远程过程调用的调用方法的参数包括远程过程调用实例句柄、要发送的远端程序、远程过程调用服务名称、远程过程调用的参数、参数个数和int64类型的第二属性数组,所述第一属性数组和所述第二属性数组以RPC_ATTR_END属性结尾;
从所述通过RpcAttribute属性方式设置的参数中获取需要的参数并调用所述原远程过程调用方法来实现所述升级版的远程过程调用方法。
可见,本申请通过基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法,在所述升级版的远程过程调用方法中,改用C语言的函数指针方式设置回调函数,并通过RpcAttribute属性方式设置参数;其中,所述基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法包括:基于原远程过程调用的注册方法设置升级版的远程过程调用的注册方法和基于原远程过程调用的调用方法设置升级版的远程过程调用的调用方法,所述升级版的远程过程调用的注册方法的参数包括远程过程调用实例句柄和int64类型的第一属性数组,所述升级版的远程过程调用的调用方法的参数包括远程过程调用实例句柄、要发送的远端程序、远程过程调用服务名称、远程过程调用的参数、参数个数和int64类型的第二属性数组,所述第一属性数组和所述第二属性数组以RPC_ATTR_END属性结尾;从所述通过RpcAttribute属性方式设置的参数中获取需要的参数并调用所述原远程过程调用方法来实现所述升级版的远程过程调用方法。可以通过改用C语言的函数指针方式设置回调函数来优化RPC方法,解决了现有技术中,由于不同版本的编译器对C++函数对象的内存布局大小可能不一致,从而可能导致程序崩溃的问题。
附图说明
图1为本申请实施例中提供的优化方法的流程图;
图2为本申请实施例中提供的优化装置的结构示意图;
图3为本申请实施例中提供的计算机可读存储介质的结构示意图;
图4为本申请实施例中提供的计算机设备的结构示意图。
具体实施方式
本申请实施例提供了一种优化方法、计算机设备和存储介质,可以通过改用C语言的函数指针方式设置回调函数来优化RPC方法,解决了现有技术中,由于不同版本的编译器对C++函数对象的内存布局大小可能不一致,从而可能导致程序崩溃的问题。
本申请实施例的技术方案为解决上述技术问题,总体思路如下:
基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法,在所述升级版的远程过程调用方法中,改用C语言的函数指针方式设置回调函数,并通过RpcAttribute属性方式设置参数;其中,所述基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法包括:基于原远程过程调用的注册方法设置升级版的远程过程调用的注册方法和基于原远程过程调用的调用方法设置升级版的远程过程调用的调用方法,所述升级版的远程过程调用的注册方法的参数包括远程过程调用实例句柄和int64类型的第一属性数组,所述升级版的远程过程调用的调用方法的参数包括远程过程调用实例句柄、要发送的远端程序、远程过程调用服务名称、远程过程调用的参数、参数个数和int64类型的第二属性数组,所述第一属性数组和所述第二属性数组以RPC_ATTR_END属性结尾;从所述通过RpcAttribute属性方式设置的参数中获取需要的参数并调用所述原远程过程调用方法来实现所述升级版的远程过程调用方法。
为了更好的理解上述技术方案,以下结合附图以及具体实施例,对上述技术方案进行进一步详细说明。应当理解,本申请实施例使用的函数名称或变量名称等,并不用于限定本申请,在一些其他可能的实现方式中,也可以使用其他命名方式。
实施例一:
请参阅图1,本实施例提供的一种优化方法包括以下步骤:
S101、基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法,在所述升级版的远程过程调用方法中,改用C语言的函数指针方式设置回调函数,并通过RpcAttribute属性方式设置参数。
在远程过程调用的实现中,有两个重要的远程过程调用方法函数,一个是远程过程调用的注册方法RpcRegisterProcedure,用来注册RPC服务,另一个是远程过程调用的调用方法RpcCallProcedure,用来调用RPC服务,为了方便与升级版的远程过程调用方法进行区分,下面将远程过程调用的注册方法RpcRegisterProcedure称为原远程过程调用的注册方法,远程过程调用的调用方法RpcCallProcedure称为原远程过程调用的调用方法。
一方面,原远程过程调用的注册方法RpcRegisterProcedure的函数原型如下:
bool RpcRegisterProcedure(HRPC rpc,const char*name,constRpcAsyncProcedure&procedure,const char*signature);
其中参数rpc表示远程过程调用实例句柄,name表示远程过程调用服务名称,procedure表示函数对象,signature表示该函数对象所需要的参数签名,参数签名用来校验调用端传递过来的参数是否符合该函数对象所需要的参数。可见,远程过程调用的注册方法RpcRegisterProcedure包括函数对象
RpcAsyncProcedure,该函数对象的类型定义如下:
typedef std::function<void(void*caller,IRpcArgument**args,intnumArgs,AsyncRpcProcedureContext asyncContext)>RpcAsyncProcedure
可见,RpcAsyncProcedure是一个接受4参数的std::function函数对象,由于std::function为C++模板类型,所以RpcAsyncProcedure函数对象为C++函数对象,第一个参数caller表示调用该远程过程调用服务的远端标识,args表示RPC调用的参数,numArgs表示参数个数,asyncContext参数表示远程过程调用服务执行的上下文环境。
另一方面,原远程过程调用的调用方法RpcCallProcedure的函数原型如下:
IRpcArgumentArray*RpcCallProcedure(HRPC rpc,void*session,const char*name,IRpcArgument**args,int numargs,const RpcCompleteRoutine async,uint32_ttimedOut);
其中rpc表示远程过程调用实例句柄,session表示要将给远程过程调用请求发送的远端程序,name表示要调用的远程过程调用服务名称,args表示本次调用的参数,numargs表示args参数个数,async不等于0的时候,表示本次调用是一个RPC异步调用,调用完成后的结果是通过async这个回调函数对象进行传递的,而不是通过该函数的返回值传递的;而如果async等于0,则表示本次调用是一个RPC同步调用,调用完成后的结果是通过该函数的返回值传递的,timeOut参数用来设置本次RPC调用的超时时间,RpcCompleteRoutine为函数对象,该函数对象的类型定义如下:
typedef std::function<void(IRpcArgumentArray*)>RpcCompleteRoutine
可见,该函数对象是一个接受一个参数的std::function函数对象,该唯一的参数表示RPC异步调用后的结果,由于std::function为C++模板类型,所以RpcCompleteRoutine函数对象为C++函数对象。
基于此,本实施例中基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法包括:基于原远程过程调用的注册方法RpcRegisterProcedure设置升级版的远程过程调用的注册方法RpcRegisterProcedureEx和基于原远程过程调用的调用方法RpcCallProcedure设置升级版的远程过程调用的调用方法RpcCallProcedureEx。
下面将分别描述两种升级版的远程过程调用方法的具体结构:
(1)升级版的远程过程调用的注册方法RpcRegisterProcedureEx:
升级版的远程过程调用的注册方法的参数包括远程过程调用实例句柄和int64类型的第一属性数组。
举个例子,升级版的远程过程调用的注册方法的函数原型如下:
bool RpcRegisterProcedureEx(HRPC rpc,int64_t*attr);
该函数只接收两个参数,一个是远程过程调用实例句柄rpc,另外是一个int64类型的第一属性数组attr,所述第一属性数组用于按照以所述RpcAttribute属性为关键字的键值对的方式存储第一回调函数、远程过程调用服务名称、参数签名和第一自定义参数。其中,在原远程过程调用的注册方法中,参数签名用来校验调用端传递过来的参数是否符合函数对象所需要的参数,函数对象所需要的参数包括远程过程调用服务的远端标识,远程过程调用的参数,参数个数,远程过程调用服务执行的上下文环境。类似的,在升级版的远程过程调用的注册方法中,参数签名用来校验调用端传递过来的参数是否符合第一回调函数所需要的参数,第一回调函数所需要的参数包括远程过程调用服务的远端标识,远程过程调用的参数,参数个数,远程过程调用服务执行的上下文环境。另外,所述第一属性数组以RPC_ATTR_END属性结尾。
应当理解,第一回调函数是以C语言的函数指针方式设置的,举个例子,第一回调函数的类型定义如下:
typedef void(*RPC_CALLBACK_FUNCTION)(void*caller,IRpcArgument**args,int numArgs,AsyncRpcProcedureContext asyncContext,void*userData)
可见,第一回调函数的参数包括远程过程调用服务的远端标识caller、远程过程调用的参数args、参数个数numArgs、远程过程调用服务执行的上下文环境AsyncRpcProcedureContext和第一自定义参数userData,其中第一自定义参数用来存储上层使用时的自定义参数,所述第一自定义参数按照以RpcAttribute属性为关键字的键值对的方式存储在所述第一属性数组中,远程过程调用的参数args表示本次调用任务需要用到的参数,相应的,参数个数numArgs表示该远程过程调用的参数的个数。
(2)升级版的远程过程调用的调用方法RpcCallProcedureEx:
升级版的远程过程调用的调用方法的参数包括远程过程调用实例句柄、要发送的远端程序、远程过程调用服务名称、远程过程调用的参数、参数个数和int64类型的第二属性数组。
举个例子,升级版的远程过程调用的调用方法的函数原型如下:
IRpcArgumentArray*RpcCallProcedureEx(HRPC rpc,void*session,constchar*name,IRpcArgument**args,int numArgs,int64_t*attr);
该函数接收参数6个参数,包括远程过程调用实例句柄rpc、要发送的远端程序session、远程过程调用服务名称name、远程过程调用的参数args、参数个数numArgs和int64类型的第二属性数组attr,所述第二属性数组用于按照以所述RpcAttribute属性为关键字的键值对的方式存储第二回调函数、超时时间和第二自定义参数,所述第二属性数组以RPC_ATTR_END属性结尾。
应当理解,第二回调函数是以C语言的函数指针方式设置的,举个例子,第二回调函数的类型定义如下:
typedef void(*RPC_COMPLETE_ROUTINE)(IRpcArgumentArray*,void*userData);
可见,第二回调函数的参数包括远程过程调用的参数IRpcArgumentArray*和第二自定义参数userData,其中第二自定义参数用来存储上层使用时的自定义参数,所述第二自定义参数按照以所述RpcAttribute属性为关键字的键值对的方式存储在所述第二属性数组中。
S102、从所述通过RpcAttribute属性方式设置的参数中获取需要的参数并调用所述原远程过程调用方法来实现所述升级版的远程过程调用方法。
举个例子,本实施例中RpcAttribute属性主要包括:
(1)RPC_ATTR_CALLBACK_FUNCTION
该属性关键字用来设定RpcRegisterProcedureEx或者RpcCallProcedureEx函数中相关的回调函数,即本实施例中的第一回调函数和第二回调函数,当在RpcRegisterProcedureEx函数中使用该属性时,表示用来注册RPC服务函数,当在RpcCallProcedureEx函数中使用该属性时,表示用来设定异步调用RPC服务。
(2)RPC_ATTR_CALLBACK_USERDATA
该属性关键字用来设定上述自定义参数void*userData的值,即本实例中的第一自定义参数和第二自定义参数。
(3)RPC_ATTR_FUNCTION_SIGNATURE
该属性关键字用来设定原RpcRegisterProcedure函数的第四个参数signature,即参数签名的值。
(4)RPC_ATTR_FUNCTION_NAME
该属性关键字用来设定原RpcRegisterProcedure函数的第二个参数RPC服务的名称name的值。
(5)RPC_ATTR_TIMEOUT_VALUE
该属性关键字用来设定原RpcCallProcedure函数中用来设置timeOut超时时间的值,如果在调用RpcCallProcedureEx的时候,没有设定该值,则默认的时间是INFINITE即无限超时时间。
(6)RPC_ATTR_ASYNC_CALL
该属性关键字用来显示的设定是否采用异步的方式去调用RPC服务。当将该属性值设定为1时,即使没有指定RPC_ATTR_CALLBACK_FUNCTION的值,在调用RpcCallProcedureEx时,也会采用异步的方式去调用RPC;如果将该属性设定为0,则显示的指明以同步的方式去调用RPC;此时即使指定了RPC_ATTR_CALLBACK_FUNCTION的值,将会被忽略。该属性的默认值为0。
(7)RPC_ATTR_JUST_NOTIFY
该属性关键字用来设定是否采用RPC通知的方式去调用RPC服务。如果将该属性的值设置为1,那么将采用RPC通知的方式去调用RPC服务,RPC通知表示调用端不需要本次调用的结果,RPC被调用端也不需要将结果反馈给调用端;如果将该值设置为0,则采用RPC请求的方式去调用RPC服务,此时调用端需要本次调用的结果,RPC被调用端也需要将结果反馈给调用方。该属性的默认值为0。
下面将分别描述两种升级版的远程过程调用方法的具体实现:
(1)升级版的远程过程调用的注册方法RpcRegisterProcedureEx:
在升级版的远程过程调用的注册方法中,从通过RpcAttribute属性方式设置的参数中获取需要的参数并调用原远程过程调用的注册方法来实现升级版的远程过程调用的注册方法,包括:
a.根据RpcAttribute属性的关键字的值从第一属性数组中获取所述远程过程调用服务名称、第一回调函数,第一自定义参数和参数签名。
从attr属性数组中获取关键字等于RPC_ATTR_FUNCTION_NAME的值,标记为rpcName,从而获取远程过程调用服务名称。
从attr属性数组中获取关键字等于RPC_ATTR_CALLBACK_FUNCTION的值,标记为rpcFunction,从而获取第一回调函数。
从attr属性数组中获取关键字等于RPC_ATTR_CALLBACK_USERDATA的值,标记为userData,从而获取第一自定义参数。
从attr属性数组中获取关键字等于RPC_ATTR_FUNCTION_SIGNATURE的值,标记为signature,从而获取参数签名。
b.调用std::bind函数,将所述第一回调函数rpcFunction和所述第一自定义参数userData绑定为第一C++函数对象,具体的:
rpcFunctionObj=std::bind(rpcFunction,userData);
c.根据远程过程调用服务名称、参数签名和第一C++函数对象,调用原远程过程调用的注册方法来实现升级版的远程过程调用的注册方法,具体的:
RpcRegisterProcedure(rpc,rpcName,rpcFunctionObj,signature)。
(2)升级版的远程过程调用的调用方法RpcCallProcedureEx:
在升级版的远程过程调用的调用方法中,从通过RpcAttribute属性方式设置的参数中获取需要的参数并调用原远程过程调用的调用方法来实现升级版的远程过程调用的调用方法,包括:
a.根据RpcAttribute属性的关键字的值从第二属性数组中获取超时时间、第二回调函数和第二自定义参数,并从RpcCallProcedureEx的参数列表中获取远程过程调用服务名称、要发送的远端程序、远程过程调用的参数和参数个数。
从attr属性数组中获取关键字等于RPC_ATTR_CALLBACK_FUNCTION的值,标记为rpcFunction,从而获取第二回调函数。
从attr属性数组中获取关键字等于RPC_ATTR_CALLBACK_USERDATA的值,标记为userData,从而获取第二自定义参数。
从attr属性数组中获取关键字等于RPC_ATTR_TIMEOUT_VALUE的值,标记为timeout,从而获取超时时间。
b.调用std::bind函数,将所述第二回调函数和所述第二自定义参数绑定为第二C++函数对象,具体的:
rpcFunctionObj=std::bind(rpcFunction,userData);
c.根据要发送的远端程序、远程过程调用服务名称、远程过程调用的参数、参数个数、超时时间和第二C++函数对象,调用原远程过程调用的调用方法,实现升级版的远程过程调用的调用方法,具体的:
RpcCallProcedure(rpc,session,rpcName,args,numargs,rpcFunctionObj,timedOut)
本实施例中,基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法,在所述升级版的远程过程调用方法中,改用C语言的函数指针方式设置回调函数,并通过RpcAttribute属性方式设置参数;其中,所述基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法包括:基于原远程过程调用的注册方法设置升级版的远程过程调用的注册方法和基于原远程过程调用的调用方法设置升级版的远程过程调用的调用方法,所述升级版的远程过程调用的注册方法的参数包括远程过程调用实例句柄和int64类型的第一属性数组,所述升级版的远程过程调用的调用方法的参数包括远程过程调用实例句柄、要发送的远端程序、远程过程调用服务名称、远程过程调用的参数、参数个数和int64类型的第二属性数组,所述第一属性数组和所述第二属性数组以RPC_ATTR_END属性结尾;从所述通过RpcAttribute属性方式设置的参数中获取需要的参数并调用所述原远程过程调用方法来实现所述升级版的远程过程调用方法。可以通过改用C语言的函数指针方式设置回调函数来优化RPC方法,解决了现有技术中,由于不同版本的编译器对C++函数对象的内存布局大小可能不一致,从而可能导致程序崩溃的问题。
基于同一发明构思,本申请提供了一种优化装置,详见图2,下面将结合图2对实施例二进行介绍。
实施例二:
请参阅图2,本实施例提供的优化装置包括:
设置单元201,用于基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法,在所述升级版的远程过程调用方法中,改用C语言的函数指针方式设置回调函数,并通过RpcAttribute属性方式设置参数;其中,所述基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法包括:基于原远程过程调用的注册方法设置升级版的远程过程调用的注册方法和基于原远程过程调用的调用方法设置升级版的远程过程调用的调用方法,所述升级版的远程过程调用的注册方法的参数包括远程过程调用实例句柄和int64类型的第一属性数组,所述升级版的远程过程调用的调用方法的参数包括远程过程调用实例句柄、要发送的远端程序、远程过程调用服务名称、远程过程调用的参数、参数个数和int64类型的第二属性数组,所述第一属性数组和所述第二属性数组以RPC_ATTR_END属性结尾;
实现单元202,用于从所述通过RpcAttribute属性方式设置的参数中获取需要的参数并调用所述原远程过程调用方法来实现所述升级版的远程过程调用方法。
本申请实施例二提供的优化装置及本申请实施例一提供的优化方法属于同一构思,其具体实现过程详见说明书全文,此处不再赘述。
基于同一发明构思,本申请提供了一种计算机可读存储介质,详见图3,下面将结合图3对实施例三进行介绍。
实施例三:
本实施例提供了一种计算机可读存储介质300,所述计算机可读存储介质300存储有计算机程序311,所述计算机程序311被处理器执行时实现以下步骤:
基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法,在所述升级版的远程过程调用方法中,改用C语言的函数指针方式设置回调函数,并通过RpcAttribute属性方式设置参数;
其中,所述基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法包括:基于原远程过程调用的注册方法设置升级版的远程过程调用的注册方法和基于原远程过程调用的调用方法设置升级版的远程过程调用的调用方法,所述升级版的远程过程调用的注册方法的参数包括远程过程调用实例句柄和int64类型的第一属性数组,所述升级版的远程过程调用的调用方法的参数包括远程过程调用实例句柄、要发送的远端程序、远程过程调用服务名称、远程过程调用的参数、参数个数和int64类型的第二属性数组,所述第一属性数组和所述第二属性数组以RPC_ATTR_END属性结尾;
从所述通过RpcAttribute属性方式设置的参数中获取需要的参数并调用所述原远程过程调用方法来实现所述升级版的远程过程调用方法。
在具体实施过程中,该计算机程序311被处理器执行时,可以实现实施例一中任一实施方式。
基于同一发明构思,本申请还提供了一种计算机设备,详见图4,下面将结合图4对实施例四进行介绍。
实施例四:
本申请提供了一种计算机设备400,包括处理器420、存储器410以及存储在存储器410上并可在处理器420上运行的计算机程序411,所述处理器420执行所述计算机程序411时实现以下步骤:
基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法,在所述升级版的远程过程调用方法中,改用C语言的函数指针方式设置回调函数,并通过RpcAttribute属性方式设置参数;
其中,所述基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法包括:基于原远程过程调用的注册方法设置升级版的远程过程调用的注册方法和基于原远程过程调用的调用方法设置升级版的远程过程调用的调用方法,所述升级版的远程过程调用的注册方法的参数包括远程过程调用实例句柄和int64类型的第一属性数组,所述升级版的远程过程调用的调用方法的参数包括远程过程调用实例句柄、要发送的远端程序、远程过程调用服务名称、远程过程调用的参数、参数个数和int64类型的第二属性数组,所述第一属性数组和所述第二属性数组以RPC_ATTR_END属性结尾;
从所述通过RpcAttribute属性方式设置的参数中获取需要的参数并调用所述原远程过程调用方法来实现所述升级版的远程过程调用方法。
由于本实施例所介绍的计算机设备400为实施本申请实施例一中优化方法所采用的设备,故而基于本申请实施例一中所介绍的方法,本领域所属技术人员能够了解本实施例的计算机设备400的具体实施方式以及其各种变化形式,所以在此对于该计算机设备400如何实现本申请实施例中的方法不再详细介绍。只要本领域所属技术人员实施本申请实施例中的方法所采用的设备,都属于本申请所欲保护的范围。
本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”、“第三”、“第四”等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的实施例能够以除了在这里图示或描述的内容以外的顺序实施。此外,术语“包括”和以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在本申请所提供的几个实施例中,应该理解到,所揭露的系统,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-OnlyMemory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述,以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。

Claims (10)

1.一种优化方法,其特征在于,所述方法包括:
基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法,在所述升级版的远程过程调用方法中,改用C语言的函数指针方式设置回调函数,并通过RpcAttribute属性方式设置参数;
其中,所述基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法包括:基于原远程过程调用的注册方法设置升级版的远程过程调用的注册方法和基于原远程过程调用的调用方法设置升级版的远程过程调用的调用方法,所述升级版的远程过程调用的注册方法的参数包括远程过程调用实例句柄和int64类型的第一属性数组,所述升级版的远程过程调用的调用方法的参数包括远程过程调用实例句柄、要发送的远端程序、远程过程调用服务名称、远程过程调用的参数、参数个数和int64类型的第二属性数组,所述第一属性数组和所述第二属性数组以RPC_ATTR_END属性结尾;
从所述通过RpcAttribute属性方式设置的参数中获取需要的参数并调用所述原远程过程调用方法来实现所述升级版的远程过程调用方法。
2.如权利要求1所述的方法,其特征在于,在所述升级版的远程过程调用的注册方法中,所述第一属性数组用于按照以所述RpcAttribute属性为关键字的键值对的方式存储第一回调函数、远程过程调用服务名称、参数签名和第一自定义参数,所述第一回调函数的参数包括远程过程调用服务的远端标识、远程过程调用的参数、参数个数、远程过程调用服务执行的上下文环境和所述第一自定义参数。
3.如权利要求2所述的方法,其特征在于,在所述升级版的远程过程调用的注册方法中,所述从所述通过RpcAttribute属性方式设置的参数中获取需要的参数并调用所述原远程过程调用方法来实现所述升级版的远程过程调用方法,包括:
根据所述RpcAttribute属性的关键字的值从所述第一属性数组中获取所述远程过程调用服务名称、所述第一回调函数,所述第一自定义参数和所述参数签名;
调用std::bind函数,将所述第一回调函数和所述第一自定义参数绑定为第一C++函数对象;
根据所述远程过程调用服务名称、所述参数签名和所述第一C++函数对象,调用所述原远程过程调用的注册方法来实现所述升级版的远程过程调用的注册方法。
4.如权利要求1所述的方法,其特征在于,在所述升级版的远程过程调用的调用方法中,所述第二属性数组用于按照以所述RpcAttribute属性为关键字的键值对的方式存储第二回调函数、超时时间和第二自定义参数,所述第二回调函数的参数包括所述远程过程调用的参数和所述第二自定义参数。
5.如权利要求4所述的方法,其特征在于,在所述升级版的远程过程调用的调用方法中,所述从所述通过RpcAttribute属性方式设置的参数中获取需要的参数并调用所述原远程过程调用方法来实现所述升级版的远程过程调用方法,包括:
根据所述RpcAttribute属性的关键字的值从所述第二属性数组中获取所述所述超时时间、所述第二回调函数和所述第二自定义参数;
从所述升级版的远程过程调用的调用方法的参数列表中获取所述要发送的远端程序、所述远程过程调用服务名称、所述远程过程调用的参数、所述参数个数;
调用std::bind函数,将所述第二回调函数和所述第二自定义参数绑定为第二C++函数对象;
根据所述要发送的远端程序、所述远程过程调用服务名称、所述远程过程调用的参数、所述参数个数、所述超时时间和所述第二C++函数对象,调用所述原远程过程调用的调用方法,实现所述升级版的远程过程调用的调用方法。
6.一种优化装置,其特征在于,所述装置包括:
设置单元,用于基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法,在所述升级版的远程过程调用方法中,改用C语言的函数指针方式设置回调函数,并通过RpcAttribute属性方式设置参数;其中,所述基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法包括:基于原远程过程调用的注册方法设置升级版的远程过程调用的注册方法和基于原远程过程调用的调用方法设置升级版的远程过程调用的调用方法,所述升级版的远程过程调用的注册方法的参数包括远程过程调用实例句柄和int64类型的第一属性数组,所述升级版的远程过程调用的调用方法的参数包括远程过程调用实例句柄、要发送的远端程序、远程过程调用服务名称、远程过程调用的参数、参数个数和int64类型的第二属性数组,所述第一属性数组和所述第二属性数组以RPC_ATTR_END属性结尾;
实现单元,用于从所述通过RpcAttribute属性方式设置的参数中获取需要的参数并调用所述原远程过程调用方法来实现所述升级版的远程过程调用方法。
7.如权利要求6所述的装置,其特征在于,在所述升级版的远程过程调用的注册方法中,所述第一属性数组用于按照以所述RpcAttribute属性为关键字的键值对的方式存储第一回调函数、远程过程调用服务名称、参数签名和第一自定义参数,所述第一回调函数的参数包括远程过程调用服务的远端标识、远程过程调用的参数、参数个数、远程过程调用服务执行的上下文环境和所述第一自定义参数。
8.如权利要求6所述的装置,其特征在于,在所述升级版的远程过程调用的调用方法中,所述第二属性数组用于按照以所述RpcAttribute属性为关键字的键值对的方式存储第二回调函数、超时时间和第二自定义参数,所述第二回调函数的参数包括所述远程过程调用的参数和所述第二自定义参数。
9.一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现以下步骤:
基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法,在所述升级版的远程过程调用方法中,改用C语言的函数指针方式设置回调函数,并通过RpcAttribute属性方式设置参数;
其中,所述基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法包括:基于原远程过程调用的注册方法设置升级版的远程过程调用的注册方法和基于原远程过程调用的调用方法设置升级版的远程过程调用的调用方法,所述升级版的远程过程调用的注册方法的参数包括远程过程调用实例句柄和int64类型的第一属性数组,所述升级版的远程过程调用的调用方法的参数包括远程过程调用实例句柄、要发送的远端程序、远程过程调用服务名称、远程过程调用的参数、参数个数和int64类型的第二属性数组,所述第一属性数组和所述第二属性数组以RPC_ATTR_END属性结尾;
从所述通过RpcAttribute属性方式设置的参数中获取需要的参数并调用所述原远程过程调用方法来实现所述升级版的远程过程调用方法。
10.一种计算机设备,包括处理器、存储器以及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现以下步骤:
基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法,在所述升级版的远程过程调用方法中,改用C语言的函数指针方式设置回调函数,并通过RpcAttribute属性方式设置参数;
其中,所述基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法包括:基于原远程过程调用的注册方法设置升级版的远程过程调用的注册方法和基于原远程过程调用的调用方法设置升级版的远程过程调用的调用方法,所述升级版的远程过程调用的注册方法的参数包括远程过程调用实例句柄和int64类型的第一属性数组,所述升级版的远程过程调用的调用方法的参数包括远程过程调用实例句柄、要发送的远端程序、远程过程调用服务名称、远程过程调用的参数、参数个数和int64类型的第二属性数组,所述第一属性数组和所述第二属性数组以RPC_ATTR_END属性结尾;
从所述通过RpcAttribute属性方式设置的参数中获取需要的参数并调用所述原远程过程调用方法来实现所述升级版的远程过程调用方法。
CN201810750601.2A 2018-07-10 2018-07-10 一种优化方法、计算机设备和存储介质 Active CN109240834B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201810750601.2A CN109240834B (zh) 2018-07-10 2018-07-10 一种优化方法、计算机设备和存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201810750601.2A CN109240834B (zh) 2018-07-10 2018-07-10 一种优化方法、计算机设备和存储介质

Publications (2)

Publication Number Publication Date
CN109240834A true CN109240834A (zh) 2019-01-18
CN109240834B CN109240834B (zh) 2021-01-01

Family

ID=65071969

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201810750601.2A Active CN109240834B (zh) 2018-07-10 2018-07-10 一种优化方法、计算机设备和存储介质

Country Status (1)

Country Link
CN (1) CN109240834B (zh)

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5247676A (en) * 1989-06-29 1993-09-21 Digital Equipment Corporation RPC based computer system using transparent callback and associated method
CN104615489A (zh) * 2015-01-22 2015-05-13 江苏大烨智能电气股份有限公司 一种多节点数据交互的实现方法
CN107277029A (zh) * 2017-06-30 2017-10-20 武汉斗鱼网络科技有限公司 一种远程过程调用的方法、装置及计算机设备
CN107643953A (zh) * 2016-07-20 2018-01-30 深圳市祈飞科技有限公司 一种远程对象调用方法及系统

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5247676A (en) * 1989-06-29 1993-09-21 Digital Equipment Corporation RPC based computer system using transparent callback and associated method
CN104615489A (zh) * 2015-01-22 2015-05-13 江苏大烨智能电气股份有限公司 一种多节点数据交互的实现方法
CN107643953A (zh) * 2016-07-20 2018-01-30 深圳市祈飞科技有限公司 一种远程对象调用方法及系统
CN107277029A (zh) * 2017-06-30 2017-10-20 武汉斗鱼网络科技有限公司 一种远程过程调用的方法、装置及计算机设备

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
_ATARAXIA: "C语言中使用函数指针实现回调", 《HTTPS://BLOG.CSDN.NET/DREAMINTHEWORLD/ARTICLE/DETAILS/75063903》 *
邹晓辉: "基于多线程和RPC技术的并行C语言的设计和实现", 《中国优秀硕士学位论文全文数据库 信息科技辑》 *

Also Published As

Publication number Publication date
CN109240834B (zh) 2021-01-01

Similar Documents

Publication Publication Date Title
CN108510389B (zh) 基于区块链的智能合约调用方法、设备及可读存储介质
US8181151B2 (en) Modeling and managing heterogeneous applications
US7900214B2 (en) System and method for adaptable provisioning of generic application content
US20060235882A1 (en) System and method for developing arbitrary and efficient mappings between complex message structures
US20060251047A1 (en) System and method of representing data entities of standard device applications as built-in components
EP1445693A2 (en) System and method for building and configuring cross-platform applications
CN104980512B (zh) 一种基于移动应用提供目标对象的方法与设备
US8352963B2 (en) Method and system for data preparation and communication between software applications
CN110221968A (zh) 软件测试方法及相关产品
CN108055320B (zh) 资源下载的处理方法、终端设备及计算机可读存储介质
KR101907837B1 (ko) 애플리케이션 활성화 프레임워크
US8387039B2 (en) System and method for customized provisioning of application content
CN111010438A (zh) 远程过程调用方法、装置、服务器及存储介质
US20060122958A1 (en) Matching client interfaces with service interfaces
CN104461893B (zh) 数据处理方法与数据处理装置
US8370862B1 (en) Communicating between software environments
CN112698930A (zh) 一种获取服务器标识的方法、装置、设备及介质
CN109240834A (zh) 一种优化方法、计算机设备和存储介质
CN111324395A (zh) 调用方法、装置和计算机可读存储介质
EP1851622A1 (en) Extending access to local software of a wireless device
CN111581578B (zh) 接口请求处理方法和装置
AU2020221273B2 (en) Stack-based communications systems and methods
CA2543959C (en) System and method for developing arbitrary and efficient mappings between complex message structures
CN111459484B (zh) 网页前后端分离开发时后端数据模拟方法
JP4669245B2 (ja) フレームワーク間連携プログラム、フレームワーク間連携方法、フレームワーク間連携装置、およびフレームワーク間連携システム

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant