Rpc là gì

  -  
Bạn sẽ xem: Rpc là gì? các thức hoạt động vui chơi của rpc Tại TP Sài Gòn Cần Thơ: Chia sẻ Kiến Thức Du Lịch & Ẩm Thực

Quý khách hàng sẽ quan tâm cho Rpc là gì? những thức hoạt động của rpc yêu cầu không? Nào hãy cùng ceds.edu.vn theo dõi bài viết này ngay sau đây nhé, vì nó vô cùng độc đáo cùng hay đấy!

XEM VIDEO Rpc là gì? những thức hoạt động của rpc trên phía trên.

Bạn đang xem: Rpc là gì


Remote Procedure Call

Trong lúc lập trình sẵn ứng dụng, có những ứng dụng được xây đắp thành các tiến trình khác biệt, chạy đôi khi. Các tiến trình này rất có thể hoạt động trên và một khối hệ thống, hoặc chuyển động bên trên nhiều khối hệ thống khác biệt. Các quá trình này hội đàm dữ liệu hỗ tương cùng nhau, quy trình này Gọi là Interprocess Communications (IPC). Remote Procedure Hotline (RPC) là 1 trong những phương thức dùng làm trao đổi dữ liệu. RPC làm cho việc tiến hành IPC thuận tiện, giống hệt như một lời call hàm bình thường. RPC rất có thể được triển khai giữa nhì tiến triền trên và một máy vi tính, hoặc thân những máy vi tính khác biệt trong mạng.

Quý khách hàng đang xem: Rpc là gì? những thức buổi giao lưu của rpc

Microsoft Windows API cung cấp bề ngoài RPC theo đúng Open Software Foundation (OSF) Distributed Computing Environment (DCE). Có nghĩa là, bất kì ứng dụng nào sử dụng RPC nhờ vào Windows API, hoàn toàn hoàn toàn có thể đàm phán với áp dụng khác thực hiện RPC theo chuẩn chỉnh DCE.

Thuật ngữ:

interface: Giao diện miêu tả phương thức giao tiếp của RPC. RPC áp dụng một ngữ điệu đặc trưng để thể hiện interface, sẽ là Interface Definition Language (IDL). IDL của Microsoft là Microsoft Interface Definition Language (MIDL).Remote Procedure : là những hàm được thiết kế tuân thủ theo đúng interface tư tưởng trước.Client: là công tác thực hiện RPC nhằm thực hiện một trách nhiệm.Server là lịch trình nhận các trải nghiệm tự client, thực hiện trách nhiệm định trước, vấn đáp công dụng mang đến client.

Các yếu tắc bao gồm của Microsoft RPC:

Trình biên dịch MIDL (MIDL compiler)Các thư viện links động (Rpcrt4.dll)Name service providerEndpoint mapper

Microsoft Interface Definition Language (MIDL)

Đây là ngữ điệu biểu hiện interface được Microsoft sử dụng. Viết một tệp tin IDL cũng giống như như lúc có mang header vào ngôn từ C, cơ mà bạn dạng thân ngôn từ này còn có thêm 1 vài ba keyword khác biệt. IDL triệu tập biểu hiện trực thuộc tính của hàm với các tyêu thích số của hàm. Sau Lúc miêu tả IDL dứt, nó rất cần phải dịch thành những tệp tin .c với .h trải qua MIDL compiler.


Để dễ nắm bắt, tôi sẽ bắt đầu bởi một ví dụ:

#include #include #define MAX_BUFF (256)void SayYouDo( __in const char *s) printf(“%s”, s);void main(void) char buf; printf(“Enter a string và press . Enter QUIT to lớn exit.n”); bởi vì memset(buf, 0, sizeof(buf)); if (fgets(buf, 256, stdin)== NULL) break; SayYouDo(buf); while (strcmp(buf, “QUITn”));Logic của lịch trình này cực kỳ đơn giản:

Đợi người dùng nhập tài liệu, hiển thị nó ra screen.Nếu người dùng nhập QUIT, thì hiển thị QUIT với thoát.

Câu hỏi đặt ra là ví như viết lại chương trình này, thay lời Gọi hàm SayYouDo() thành RPC thì đang rứa nào?

Xây dựng file IDL

// File SayYouDo.idl// Compiling SayYouDo.idl: // midl /app_config SayYouDo.idlinterface RpcExample void SayYouDo( const char* s // a zero-terminated string. ); void ShutdownRpc( void );Mô tả trên bao gồm:UUID: Các interface được rành mạch với nhau trải qua uuid. Giá trị này yêu cầu là duy nhất. UUID có thể có mặt bằng lý lẽ Create UUID của Microsoft. Công rứa này có sẵn vào cỗ Visual Studio.


*

version: cho thấy phiên bạn dạng của interface. Trong ví dụ này là 1 trong.0

binding handle:

Để đọc định nghĩa này, nên phát âm Binding là một trong quá trình cấu hình thiết lập một liên kết lô ghích (logical connection) giữa chương trình client cùng công tác VPS. tin tức về kết nối nữa client và hệ thống được biểu diễn thông qua 1 kết cấu, Điện thoại tư vấn là binding handle.

Trên thực tế, RPC client cùng RPC VPS rất có thể vị trí và một máy vi tính hoặc trên 2 máy tính xách tay khác biệt. Client và hệ thống rất có thể giao tiếp trải qua nhiều một số loại giao thức khác nhau (TCPhường., Named pipe, …). Về mặt xúc tích, client cùng server chỉ phát âm là đang kết nối với nhau trải qua binding handle cơ mà ko đề nghị phát âm gốc rễ giao tiếp dưới (TCPhường., Named pipe, …) đang sử dụng là gì. Tyêu thích khảo list những Protocol có thể sử dụng được: Protocol Sequence.

Có 3 một số loại binding handle có thể dùng được, bao gồm: implicit_handle, auto_handle explicit_handle.

implicit_handle Có nghĩa là binding handle được gọi ngầm định, không cần phải có trong tmê say số lúc hotline hàm RPC. Nên dùng nhiều loại này.

Xem thêm: Chuẩn Giao Tiếp Ahci Là Gì ? Cách Bật Chế Độ Ahci Trong Bios Chi Tiết

explicit_handle tức là binding handle được gọi tường minh, phải bao gồm vào tđê mê số Lúc Điện thoại tư vấn hàm RPC. Đây là tđắm say số thứ nhất của hàm.


auto_handle: hoàn toàn có thể đọc là loại kết hợp của 2 thứ hạng bên trên.

Biên dịch MIDL bằng MIDL compiler gồm sẵn của Visual Studio

tùy lựa chọn /app_config được cho phép thực hiện một số trong những keyword của Application Configuration File (ACF) phía bên trong tệp tin IDL.

interface: Định nghĩa interface bao hàm tên hàm cùng những tsay đắm số. Các tmê mẩn số yêu cầu khái niệm rõ kiểu dữ liệu . Thuộc tính của các ngôi trường tài liệu vào ngôn từ IDL hoàn toàn có thể tìm hiểu thêm sinh sống đây: IDL Attributes

Compile MIDL file

Sử dụng MIDL Compiler để sinch code mang đến client cùng VPS. Quá trình này sẽ tạo ra 3 file:

SayYouDo.h: Header cho tất cả client và server

SayYouDo_c.c: Client stub

SayYouDo_s.c: hệ thống stub

Trong quá trình biên dịch, cần lưu ý: lựa chọn đúng căn cơ (x86, x64 xuất xắc ia64) Khi biên dịch. Tsi số này có thể tìm hiểu thêm thông qua tùy chọn /win32, /x64 hoặc /ia64 của midl compiler.


*

RPC Server

#include #include “../Protocol/SayYouDo.h”#pragma comment(lib, “Rpcrt4.lib”) // RPC Functions#if defined UNICODE || defined _UNICODE#define RPC_TSTR RPC_WSTR#else#define RPC_TSTR RPC_CSTR#endif#define RPC_PROTOCOL TEXT(“ncacn_np”)#define RPC_NETWORK_ADDRESS (NULL)#define RPC_END_POINT TEXT(“pipehello”)HANDLE hStopEvent = NULL;// Server functions.#ifdef __cplusplusextern “C”{#endifvoid SayYouDo(const unsigned char *s){std::cout (RPC_PROTOCOL), // protocol.RPC_C_PROTSEQ_MAX_REQS_DEFAULT, // Backlog queue .reinterpret_cast(RPC_END_POINT), // endpoint.NULL); // No security.if (status)exit(status);std::cout

Đăng kí interface

Cmùi hương trình vẫn đăng kí một interface với khối hệ thống trải qua hàm RpcServerRegisterIf2.

RPC_STATUS RPC_ENTRY RpcServerRegisterIf2( RPC_IF_HANDLE IfSpec, UUID *MgrTypeUuid, RPC_MGR_EPV *MgrEpv, unsigned int Flags, unsigned int MaxCalls, unsigned int MaxRpcSize, RPC_IF_CALLBACK_FN *IfCallbackFn);

Theo tay nghề bạn dạng thân, các bạn cần cần sử dụng hàm RpcServerRegisterIf2 hoặc RpcServerRegisterIfEx nắm mang đến RpcServerRegisterIf lúc đăng kí interface. Nên tùy chỉnh cấu hình cờ RPC_IF_ALLOW_CALLBACKS_WITH_NO_AUTH Lúc đăng kí interface, IfCallbackFn thì có thể tùy chỉnh hoặc đặt bằng NULL.

Điều này đang tách mang đến client ( xin đề cập lại là client) bị crash thân chừng khi kết nối cho tới RPC server. Lỗi này hơi khó chịu! Client sẽ ảnh hưởng crash lúc hotline hàm NdrClientCall2, trong khi núm liên kết tới server. Các bạn sẽ ko lúc nào dùng hàm NdrClientCall2 trong code của chúng ta, NdrClientCall2 được xuất hiện auto vào client code stub.


RpcServerListen nhằm bắt đàu dìm kết nối trường đoản cú client. Sau hàm này, server rất có thể xem là chuẩn bị sẵn sàng.

Implement interface

tại chỗ này, mình implement cho 2 hàm SayYouDo và ShutdownRpc.

Phía hệ thống phải implement 2 hàm mang đến quản lý cỗ nhớ:Hai hàm này được thực hiện Lúc hệ thống cấp phát bộ lưu trữ rượu cồn Khi chạy.

void* __RPC_USER midl_user_allocate(size_t size);void __RPC_USER midl_user_free(void* p);

Shutting down the server

Để tắt RPC VPS, bạn dùng hàm RpcMgmtStopServerListening. Để biết khi nào tắt hệ thống, thì rất có thể tinh chỉnh và điều khiển qua client nlỗi bản thân làm.

Xem thêm: Hướng Dẫn Tải Hexxit Đơn Giản Cho Các Bạn Máy Yếu), Hướng Dẫn Tải Minecraft Hexxit

RPC Client

#include #include #include “../Protocol/SayYouDo.h”#pragma comment(lib, “Rpcrt4.lib”) // RPC Functions#if defined UNICODE || defined _UNICODE#define RPC_TSTR RPC_WSTR#else#define RPC_TSTR RPC_CSTR#endif#define RPC_PROTOCOL TEXT(“ncacn_np”)#define RPC_NETWORK_ADDRESS (NULL)#define RPC_END_POINT TEXT(“pipehello”)int main( int argc, char *argv){RPC_STATUS status;RPC_TSTR szStringBinding = NULL;// Creates a string binding handle.status = RpcStringBindingCompose(NULL, // UUID to lớn bind to lớn.reinterpret_cast(RPC_PROTOCOL), // protocol.reinterpret_cast(RPC_NETWORK_ADDRESS), // network address to lớn use.reinterpret_cast(RPC_END_POINT), // endpoint.NULL, // Protocol dependent network options to use.&szStringBinding); // String binding output.if (status)exit(status);// Validates the format of the string binding handle status = RpcBindingFromStringBinding(szStringBinding, // The string binding to validate.&hBinding); // Put the result in the implicit binding handleif (status)exit(status);char buf;memset(buf, 0, sizeof(buf));bool bStopped = false;std::cout Client áp dụng RpcStringBindingCompose để sinh sản binding string với chuyển đổi string thành binding handle trải qua hàm RpcBindingFromStringBinding

Client cũng cần 2 hàm đến bài toán làm chủ bộ nhớ hễ, nlỗi nghỉ ngơi VPS.

Sau Khi tạo handle thành công, client sẽ call hàm thông qua RPC nhỏng sau:

RpcTryExcept SayYouDo((const unsigned char *)buf); RpcExcept(1) { std::cerr

Compile & Link


*

*

Lưu ý khi sử dụng explicit_handle

Trong ngôi trường hợp dùng explicit_handle thì nên knhị báo như sau:

// File SayYouDo.idl// Compiling SayYouDo.idl: // midl /app_config SayYouDo.idlinterface RpcExample void SayYouDo( handle_t hBinding, const char* s // a zero-terminated string. ); void ShutdownRpc( handle_t hBinding );Server :

// Server functions.#ifdef __cplusplusextern “C”{#endifvoid SayYouDo(handle_t hBinding, const unsigned char *s){std::cout Client

// Validates the format of the string binding handle status = RpcBindingFromStringBinding( szStringBinding, // The string binding lớn validate. &hBinding); // Put the result in the implicit binding handle if (status) exit(status); RpcTryExcept SayYouDo(hBinding, (const unsigned char *)buf); RpcExcept(1) { std::cerr

Source Code – Mã nguồn

Đây là toàn bộ mã mối cung cấp lịch trình mẫu: RpcExample.Chuyên mục: Tin Tức