123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- /***********************************************
- File Name: main.cpp
- Author: Abby Cin
- Mail: abbytsing@gmail.com
- Created Time: 10/24/20 2:45 PM
- ***********************************************/
-
- #include "aux.h"
- #include "context.h"
- #include "peer.h"
- #include "acceptor.h"
-
- struct task
- {
- };
- template<typename... Args>
- struct std::coroutine_traits<task, Args...>
- {
- struct promise_type
- {
- task get_return_object() { return {}; }
- suspend_never initial_suspend() { return {}; }
- suspend_never final_suspend() { return {}; }
- void return_void(){};
- void unhandled_exception() { std::terminate(); }
- };
- };
-
- task session(peer&& tmp)
- {
- peer client{std::move(tmp)};
- char data[128]{};
- for(;;)
- {
- auto n = co_await client.read_some(data, sizeof(data));
- if(n < 1)
- {
- break;
- }
-
- int sent = 0;
- while(sent < n)
- {
- auto x = co_await client.write_some(data + sent, n - sent);
- if(x < 0)
- {
- sent = x;
- break;
- }
- sent += x;
- }
- if(sent < 0)
- {
- break;
- }
- }
- }
-
- task spawn(context& ctx, resolver& rr)
- {
- acceptor a{ctx, rr};
- if(a.listen() < 0)
- {
- ctx.stop();
- co_return;
- }
- for(;;)
- {
- session(co_await a.accept());
- if(!ctx.running())
- {
- break;
- }
- }
- }
-
- context* gctx = nullptr;
- void handler(int) { gctx->stop(); }
-
- int main()
- {
- context ctx{};
- auto addr = resolver::from_str("127.0.0.1:8889");
- spawn(ctx, addr);
-
- ::signal(SIGINT, handler);
- ::signal(SIGTERM, handler);
- gctx = &ctx;
- ctx.run();
- }
|