diff options
Diffstat (limited to 'comp3331/server/src/shared/connection.hh')
| -rw-r--r-- | comp3331/server/src/shared/connection.hh | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/comp3331/server/src/shared/connection.hh b/comp3331/server/src/shared/connection.hh new file mode 100644 index 0000000..d7237cb --- /dev/null +++ b/comp3331/server/src/shared/connection.hh @@ -0,0 +1,60 @@ +#ifndef SHARED_CONNECTION_HH_ +#define SHARED_CONNECTION_HH_ + +#include <atomic> +#include <memory> +#include <mutex> +#include <vector> + +#include "shared/net.hh" + +namespace shared { + +// The connection class abstracts sending and receiving data, including reliable +// transmission over UDP. +class connection { +private: + shared::socket_t sock; + sockaddr_in info; + +private: + std::uint32_t seq_num = 0; // track packet sequence number + std::uint32_t ack_num = 0; + + // for reliable transport, spawn a new thread which reads sent/received + std::unique_ptr<std::atomic<bool>> should_thread_exit; + std::unique_ptr<std::mutex> lock; + std::vector<packet> sent; + std::vector<packet> received; + std::shared_ptr<std::thread> reliable_transport_thread; + void do_reliable_transport() noexcept; + +public: + connection(const socket_t& sock, sockaddr_in&& info) + : sock(sock), info(std::move(info)), + should_thread_exit(std::make_unique<std::atomic<bool>>(false)), + lock(std::make_unique<std::mutex>()), + reliable_transport_thread(std::make_shared<std::thread>( + &connection::do_reliable_transport, this)) {} + + connection(const connection&) = delete; + connection(connection&&) = default; + ~connection() noexcept { + *this->should_thread_exit = true; + this->reliable_transport_thread->join(); + } + +public: + const sockaddr_in& get_info() const noexcept { return this->info; } + const socket_t& get_socket() const noexcept { return this->sock; } + +public: + // All unreliable packets should go through these functions so we may track + // if our packets have been sent or received, making them reliable. + void send_packet(packet&& packet) noexcept; + bool should_discard_packet(const packet& packet) noexcept; +}; + +} // namespace shared + +#endif |
