Orbit Framework
An ultra-modern, asynchronous, cross-platform C++ Web Framework.
Loading...
Searching...
No Matches
IocpProactor.hpp
Go to the documentation of this file.
1#pragma once
3
4#ifdef _WIN32
5#include <unordered_map>
6#include <mutex>
7#include <vector>
8
9namespace network {
10
11enum class IocpOperationType {
12 READ,
13 WRITE,
14 ACCEPT,
15 CONNECT,
16 SENDFILE
17};
18
19struct IocpContext {
20 OVERLAPPED overlapped;
21 socket_t fd;
22 IocpOperationType type;
23 std::function<void(ssize_t)> io_callback;
24 std::function<void(socket_t, sockaddr_in)> accept_callback;
25 std::function<void(int)> connect_callback;
26
27 // For AcceptEx
28 socket_t accept_socket{INVALID_SOCKET_FD};
29 char accept_buffer[(sizeof(sockaddr_in) + 16) * 2];
30
31 // For WSARecv/WSASend
32 WSABUF wsa_buf;
33
34 IocpContext() {
35 memset(&overlapped, 0, sizeof(OVERLAPPED));
36 }
37};
38
39class IocpProactor : public Proactor {
40public:
41 IocpProactor();
42 ~IocpProactor() override;
43
44 void run_once(int timeout_ms) override;
45
46 void async_read(socket_t fd, void* buffer, size_t size, std::function<void(ssize_t bytes_read)> callback) override;
47 void async_write(socket_t fd, const void* buffer, size_t size, std::function<void(ssize_t bytes_written)> callback) override;
48
49 // IOCP does not directly support readiness polling without reading/writing,
50 // so we emulate it using zero-byte reads or event selection if necessary.
51 void async_wait_read(socket_t fd, std::function<void()> callback) override;
52 void async_wait_write(socket_t fd, std::function<void()> callback) override;
53
54 void async_sendfile(socket_t out_fd, int in_fd, off_t offset, size_t count, std::function<void(ssize_t bytes_written)> callback) override;
55 void async_accept(socket_t fd, std::function<void(socket_t new_fd, sockaddr_in addr)> callback) override;
56 void async_connect(socket_t fd, const sockaddr_in& addr, std::function<void(int status)> callback) override;
57
58 void remove(socket_t fd) override;
59
60private:
61 void register_socket(socket_t fd);
62
63 HANDLE iocp_handle_;
64 std::mutex mutex_;
65 std::unordered_map<socket_t, std::vector<IocpContext*>> pending_contexts_;
66};
67
68} // namespace network
69#endif // _WIN32
Definition ResponseWriter.hpp:7
int socket_t
Definition PlatformSocket.hpp:36
constexpr socket_t INVALID_SOCKET_FD
Definition PlatformSocket.hpp:37