-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathclient.cpp
More file actions
110 lines (94 loc) · 2.76 KB
/
client.cpp
File metadata and controls
110 lines (94 loc) · 2.76 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
// client.cpp
// RPC 客户端:构造请求,发送到服务端,接收并解析响应
#include <iostream>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include "math.pb.h"
#include "utils.h"
// 复用相同的头部结构
#pragma pack(push, 1)
struct RpcHeader {
uint32_t magic;
uint32_t msg_id;
uint32_t method_len;
};
#pragma pack(pop)
int call_add(int a, int b) {
// 创建 socket
int sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0) {
perror("socket");
return -1;
}
// 连接服务端
sockaddr_in addr{};
addr.sin_family = AF_INET;
addr.sin_port = htons(8888);
inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr);
if (connect(sock, reinterpret_cast<sockaddr*>(&addr), sizeof(addr)) < 0) {
perror("connect");
close(sock);
return -1;
}
// 构造请求
AddRequest req;
req.set_a(a);
req.set_b(b);
std::string req_body;
req.SerializeToString(&req_body);
std::string method = "/Math/Add";
// 构造请求头部
RpcHeader hdr;
hdr.magic = host_to_net(0x12345678);
hdr.msg_id = host_to_net(1001); // 任意请求 ID
hdr.method_len = host_to_net(static_cast<uint32_t>(method.size()));
uint32_t body_size = host_to_net(static_cast<uint32_t>(req_body.size()));
// 发送请求
write_full(sock, &hdr, sizeof(hdr));
write_full(sock, method.data(), method.size());
write_full(sock, &body_size, sizeof(body_size));
write_full(sock, req_body.data(), req_body.size());
// 接收响应头部
RpcHeader resp_hdr;
if (!read_full(sock, &resp_hdr, sizeof(resp_hdr))) {
close(sock);
return -1;
}
resp_hdr.magic = net_to_host(resp_hdr.magic);
resp_hdr.msg_id = net_to_host(resp_hdr.msg_id);
resp_hdr.method_len = net_to_host(resp_hdr.method_len);
if (resp_hdr.magic != 0x12345678) {
std::cerr << "❌ Invalid response magic\n";
close(sock);
return -1;
}
// 读取响应 body 长度
uint32_t r_body_size;
if (!read_full(sock, &r_body_size, sizeof(r_body_size))) {
close(sock);
return -1;
}
r_body_size = net_to_host(r_body_size);
// 读取响应 body
std::vector<char> resp_buf(r_body_size);
if (!read_full(sock, resp_buf.data(), r_body_size)) {
close(sock);
return -1;
}
// 反序列化响应
AddResponse resp;
if (!resp.ParseFromArray(resp_buf.data(), static_cast<int>(r_body_size))) {
std::cerr << "❌ Failed to parse response\n";
close(sock);
return -1;
}
close(sock);
return resp.result();
}
int main() {
int result = call_add(3, 5);
std::cout << "✅ 3 + 5 = " << result << std::endl;
return 0;
}