-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathecho_server.cpp
More file actions
51 lines (41 loc) · 1.43 KB
/
Copy pathecho_server.cpp
File metadata and controls
51 lines (41 loc) · 1.43 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
#include "io_context.hpp"
#include "awaiter.hpp"
task<> echo_socket(std::shared_ptr<Socket> socket) {
while(1) {
char buffer[1024] = {0};
ssize_t recv_len = co_await socket->recv(buffer, sizeof(buffer));
std::cout << "recv buffer = " << buffer << "\n";
ssize_t send_len = 0;
while(send_len < recv_len) {
ssize_t ret = co_await socket->send(buffer + send_len, recv_len - send_len);
if (ret <= 0)
co_return;
send_len += ret;
}
std::cout << "send done, buffer = " << buffer << "\n";
// 说明客户端关闭连接(::recv会返回0,而不是-1)
if (recv_len <= 0) {
co_return;
}
}
}
task<> accept(Socket& listen) {
while(1) {
std::cout << "accept begin\n";
// 最后返回值是 task<std::shared_ptr<Socket>>::T await_resume() 来的
auto socket = co_await listen.accept();
std::cout << "Socket use_count: " << socket.use_count() << "\n";
std::cout << "client = " << socket->getfd() << "\n";
auto t = echo_socket(socket);
std::cout << "Socket use_count: " << socket.use_count() << "\n";
t.resume();
}
}
int main() {
IoContext io_context;
Socket listen{"8080", io_context};
std::cout << "listen = " << listen.getfd() << "\n";
auto t = accept(listen);
t.resume();
io_context.run();
}