在Linux C环境,基于文件描述符和socket,实现一款通用的rpc框架,并提供完整的样例代码
时间: 2024-11-22 11:40:54 浏览: 12
linux socket样例代码
在Linux C环境中,要实现一个基于文件描述符(file descriptors)的RPC(Remote Procedure Call,远程过程调用)框架,通常会利用网络编程库,如Berkeley Sockets API(也称为Socket API)。这里是一个简化的示例,展示了如何创建一个基本的服务器和客户端结构,以及如何发送和接收请求。
**服务器端(server.c):**
```c
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
// 假设我们的服务函数原型是这样的
void *my_rpc_service(int fd, char* data);
int main() {
int server_fd, client_fd;
struct sockaddr_in server_addr, client_addr;
socklen_t addr_len = sizeof(server_addr);
// 创建服务器套接字
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("Error creating server socket");
return 1;
}
// 设置服务器地址
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(SOME_PORT); // 替换为实际的端口号
server_addr.sin_addr.s_addr = INADDR_ANY;
// 绑定并监听
if (bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {
perror("Error binding server");
close(server_fd);
return 1;
}
listen(server_fd, 5); // 监听队列长度
// 接受客户端连接
while (true) {
if ((client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &addr_len)) == -1) {
perror("Error accepting client");
continue;
}
// 启动新线程处理客户端请求
pid_t pid = fork();
if (pid == 0) { // 子进程
dup2(client_fd, STDIN_FILENO); // 将客户端的fd复制到标准输入
dup2(client_fd, STDOUT_FILENO); // 将客户端的fd复制到标准输出
dup2(client_fd, STDERR_FILENO); // 将客户端的fd复制到标准错误
// 调用服务函数
my_rpc_service(client_fd, NULL); // 这里假设数据通过命令行传递
exit(0);
} else if (pid > 0) {
close(client_fd); // 父进程中关闭已处理的连接
} else {
perror("Error forking child process");
exit(1);
}
}
return 0;
}
void *my_rpc_service(int fd, char* data) {
// ... 实现具体的RPC服务
}
```
**客户端(client.c):**
```c
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <arpa/inet.h>
void send_request(const char* service_name, void* data, int len) {
int sockfd;
struct sockaddr_in server_addr;
char request[256];
// 创建套接字,设置地址...
...
// 构造请求消息
snprintf(request, sizeof(request), "%s %d", service_name, len);
if (send(sockfd, request, strlen(request), 0) < 0) {
perror("Error sending request");
return;
}
if (data != NULL) {
// 发送数据
...
}
// 接收响应
...
}
int main() {
char data[] = "Hello from client"; // 示例数据
send_request("my_rpc_service", data, sizeof(data));
return 0;
}
```
注意这是一个非常基础的例子,实际应用中需要考虑更复杂的功能,如错误处理、序列化/反序列化数据、协议解析等。此外,`my_rpc_service`函数的具体实现取决于你想暴露给客户端的实际服务。
阅读全文