什么是RPC
RPC(Remote Procedure Call,远程过程调用)是一种通过网络从远程计算机程序上执行子程序或服务的技术。RPC 允许一个程序像调用本地函数一样调用另一个进程中的函数,但实际上这些函数在远程服务器上执行。
简单理解
可以将 RPC 想象成是给远程服务器打电话来完成某个任务。例如,你在本地电脑上运行一个程序,当需要执行一个特定的任务时,你拨打远程服务器的“电话”,请求它执行这个任务。远程服务器完成任务后,将结果返回给你。
示例代码(C语言)
服务器端代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#define SOCKET_PATH "/tmp/rpc_socket"
void handle_client(int client_socket) {
char buffer[256];
int n = read(client_socket, buffer, 255);
if (n < 0) {
perror("ERROR reading from socket");
return;
}
printf("Server received: %s\n", buffer);
// Simulate a remote procedure (simple addition)
int a, b;
sscanf(buffer, "%d %d", &a, &b);
int result = a + b;
snprintf(buffer, 256, "Result: %d", result);
n = write(client_socket, buffer, strlen(buffer));
if (n < 0) {
perror("ERROR writing to socket");
}
}
int main() {
int server_socket, client_socket;
struct sockaddr_un server_addr;
server_socket = socket(AF_UNIX, SOCK_STREAM, 0);
if (server_socket < 0) {
perror("ERROR opening socket");
exit(1);
}
memset(&server_addr, 0, sizeof(struct sockaddr_un));
server_addr.sun_family = AF_UNIX;
strncpy(server_addr.sun_path, SOCKET_PATH, sizeof(server_addr.sun_path) - 1);
if (bind(server_socket, (struct sockaddr *)&server_addr, sizeof(struct sockaddr_un)) < 0) {
perror("ERROR on binding");
close(server_socket);
exit(1);
}
listen(server_socket, 5);
while (1) {
client_socket = accept(server_socket, NULL, NULL);
if (client_socket < 0) {
perror("ERROR on accept");
continue;
}
handle_client(client_socket);
close(client_socket);
}
close(server_socket);
unlink(SOCKET_PATH);
return 0;
}
客户端代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#define SOCKET_PATH "/tmp/rpc_socket"
int main() {
int client_socket;
struct sockaddr_un server_addr;
char buffer[256];
client_socket = socket(AF_UNIX, SOCK_STREAM, 0);
if (client_socket < 0) {
perror("ERROR opening socket");
exit(1);
}
memset(&server_addr, 0, sizeof(struct sockaddr_un));
server_addr.sun_family = AF_UNIX;
strncpy(server_addr.sun_path, SOCKET_PATH, sizeof(server_addr.sun_path) - 1);
if (connect(client_socket, (struct sockaddr *)&server_addr, sizeof(struct sockaddr_un)) < 0) {
perror("ERROR connecting");
close(client_socket);
exit(1);
}
printf("Enter two numbers: ");
fgets(buffer, 255, stdin);
int n = write(client_socket, buffer, strlen(buffer));
if (n < 0) {
perror("ERROR writing to socket");
close(client_socket);
exit(1);
}
n = read(client_socket, buffer, 255);
if (n < 0) {
perror("ERROR reading from socket");
close(client_socket);
exit(1);
}
printf("Server response: %s\n", buffer);
close(client_socket);
return 0;
}
如何运行
1.编译服务器和客户端代码:
gcc -o rpc_server rpc_server.c
gcc -o rpc_client rpc_client.c
2.运行服务器:
./rpc_server
3.在另一个终端运行客户端:
./rpc_client
4.在客户端中输入两个数字,服务器将接收这些数字,执行加法运算,并返回结果。