-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathserver.cpp
More file actions
150 lines (126 loc) · 4.44 KB
/
server.cpp
File metadata and controls
150 lines (126 loc) · 4.44 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
// server.cpp
// RPC 服务端:监听端口,接收请求,调用服务,返回结果
#include <iostream>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <cstring>
#include "math.pb.h"
#include "service_registry.h"
#include "utils.h"
#include "math_service.h"
// 自定义协议头部(8 字节)
// | magic(4B) | msg_id(4B) | method_len(4B) | method_name | body_size(4B) | protobuf_body |
#pragma pack(push, 1)
struct RpcHeader {
uint32_t magic; // 固定值 0x12345678,用于校验
uint32_t msg_id; // 请求 ID,用于匹配响应(本例未用)
uint32_t method_len; // 方法名长度
};
#pragma pack(pop)
int main() {
// 注册所有服务
RegisterMathService();
std::cout << "✅ Math service registered.\n";
// 创建 TCP socket
int listen_fd = socket(AF_INET, SOCK_STREAM, 0);
if (listen_fd < 0) {
perror("socket");
return 1;
}
// 设置地址复用(避免 TIME_WAIT 问题)
int opt = 1;
setsockopt(listen_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
// 绑定地址
sockaddr_in server_addr{};
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8888);
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(listen_fd, reinterpret_cast<sockaddr*>(&server_addr), sizeof(server_addr)) < 0) {
perror("bind");
close(listen_fd);
return 1;
}
// 开始监听
if (listen(listen_fd, 5) < 0) {
perror("listen");
close(listen_fd);
return 1;
}
std::cout << "🚀 Server listening on 0.0.0.0:8888\n";
while (true) {
// 接受新连接
sockaddr_in client_addr;
socklen_t client_len = sizeof(client_addr);
int conn_fd = accept(listen_fd, reinterpret_cast<sockaddr*>(&client_addr), &client_len);
if (conn_fd < 0) {
perror("accept");
continue;
}
// 读取头部(12 字节)
RpcHeader header;
if (!read_full(conn_fd, &header, sizeof(header))) {
close(conn_fd);
continue;
}
// 字节序转换
header.magic = net_to_host(header.magic);
header.msg_id = net_to_host(header.msg_id);
header.method_len = net_to_host(header.method_len);
// 魔数校验
if (header.magic != 0x12345678) {
std::cerr << "❌ Invalid magic number\n";
close(conn_fd);
continue;
}
// 读取方法名
std::string method_name(header.method_len, '\0');
if (!read_full(conn_fd, method_name.data(), header.method_len)) {
close(conn_fd);
continue;
}
// 读取 body 长度
uint32_t body_size;
if (!read_full(conn_fd, &body_size, sizeof(body_size))) {
close(conn_fd);
continue;
}
body_size = net_to_host(body_size);
// 读取 body 数据
std::vector<char> body(body_size);
if (!read_full(conn_fd, body.data(), body_size)) {
close(conn_fd);
continue;
}
// 反序列化请求(这里假设是 AddRequest,实际应根据 method_name 动态创建)
AddRequest request;
if (!request.ParseFromArray(body.data(), static_cast<int>(body_size))) {
std::cerr << "❌ Failed to parse request\n";
close(conn_fd);
continue;
}
// 调用服务
AddResponse response;
if (!ServiceRegistry::Instance().Handle(method_name, &request, &response)) {
std::cerr << "❌ Method not found: " << method_name << "\n";
close(conn_fd);
continue;
}
// 序列化响应
std::string response_data;
response.SerializeToString(&response_data);
// 构造响应头部(响应中 method_len = 0)
RpcHeader resp_header;
resp_header.magic = host_to_net(0x12345678);
resp_header.msg_id = host_to_net(header.msg_id); // 回显请求 ID
resp_header.method_len = host_to_net(0);
uint32_t resp_body_size = host_to_net(static_cast<uint32_t>(response_data.size()));
// 发送响应
write_full(conn_fd, &resp_header, sizeof(resp_header));
write_full(conn_fd, &resp_body_size, sizeof(resp_body_size));
write_full(conn_fd, response_data.data(), response_data.size());
close(conn_fd);
}
close(listen_fd);
return 0;
}