浅谈RPC功能以及RPC示例

什么是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.在客户端中输入两个数字,服务器将接收这些数字,执行加法运算,并返回结果。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值