Cogs.Core
Connection.h
1#pragma once
2
3#if !defined( EMSCRIPTEN )
4
5#include "Address.h"
6#include "../Platform/Atomic.h"
7
8#if defined( _WIN32 )
9 #include <WinSock2.h>
10#else
11 #include <sys/socket.h>
12#endif
13
14namespace Cogs {
15
16 namespace Network {
17#if defined( _WIN32 )
18 typedef SOCKET Socket;
19 typedef int SocketType;
20 typedef IPPROTO IPProto;
21 #define InvalidSocket INVALID_SOCKET
22#else
23 typedef int Socket;
24 typedef int SocketType;
25 typedef int IPProto;
26 #define InvalidSocket (-1)
27#endif
28
29 /*
30 * Connection
31 */
32 class COGSFOUNDATION_API ConnectionBase{
33 public:
34 ConnectionBase() { }
35 virtual ~ConnectionBase() { }
36
37 Family family() const { return AF_INET; } // Only IPv4 for now
38 virtual SocketType type() const = 0;
39 virtual IPProto proto() const = 0;
40
41 Socket getSocket() const { return socket; }
42
43 void remove() { flags |= cRemove; }
44 void removeAndDelete() { flags |= cRemove | cDelete; }
45
46 const SockaddrIn& getAddress() const { return sockAddr; }
47 int64_t getReconnectTime() const { return reconnectTime; }
48
49 virtual bool isAutoConnectEnabled() const { return false; }
50 virtual bool isConnected() const { return (socket != InvalidSocket); }
51 bool shouldRemove() const { return flags & cRemove; }
52 bool shouldDelete() const { return flags & cDelete; }
53
54 void setNonblocking(bool val = true);
55 void setDoNotProcess() { flags |= cDoNotProcess; }
56
57 virtual bool reconnect() { return false; }
58 virtual bool disconnect() = 0;
59
60 bool bind(uint16_t port) { return bind(AddrIn((uint32_t)INADDR_ANY), port); }
61 virtual bool bind(AddrIn ip, uint16_t port);
62
63 bool send(const void* data, uint64_t byteCount, uint64_t& bytesSent);
64 bool receive(void* buffer, uint64_t byteCount, uint64_t& bytesReceived);
65
66 bool sendTo(const void *data, uint64_t byteCount, uint64_t &bytesSent, const SockaddrIn &addr);
67 bool recvFrom(void* buffer, uint64_t byteCount, uint64_t& bytesReceived, SockaddrIn &addr);
68
69 virtual bool processOutgoing() { return true; }
70 virtual bool processIncoming() { return true; }
71
72 protected:
73 void create();
74 void close();
75
76 Cogs::Atomic< uint32_t > flags = 0;
77 int64_t reconnectTime = 0;
78
79 static constexpr uint32_t cRemove = 0x00000001;
80 static constexpr uint32_t cDelete = 0x00000002;
81 static constexpr uint32_t cDoNotProcess = 0x00000004; // Do not process this connection.
82 // Bits 16-31 available for connection-derived types...
83
84 Socket socket = InvalidSocket;
85 SockaddrIn sockAddr = {};
86 };
87
88 /*
89 * UDP Connection
90 */
91 class COGSFOUNDATION_API ConnectionUDP : public ConnectionBase {
92 public:
93 ConnectionUDP() = default;
95
96 SocketType type() const override { return SOCK_DGRAM; }
97 IPProto proto() const override { return IPPROTO_UDP; }
98
99 void setMulticastAdapter(const AddrIn& addr) { multicastAdapter = addr; }
100
101 virtual bool bind(AddrIn ip, uint16_t port) override;
102 virtual bool disconnect() override;
103
104 private:
105 AddrIn multicastAdapter;
106 };
107
108 /*
109 * TCP Connection
110 */
111 class COGSFOUNDATION_API ConnectionTCP : public ConnectionBase {
112 public:
113 ConnectionTCP() { flags = cNoDelay; }
114 ConnectionTCP(Socket socket, const SockaddrIn& addr);
115 virtual ~ConnectionTCP();
116
117 SocketType type() const override { return SOCK_STREAM; }
118 IPProto proto() const override { return IPPROTO_TCP; }
119
120 void enableAutoReconnect() { flags |= cAutoReconnect; }
121 void disableAutoReconnect() { flags &= ~cAutoReconnect; }
122 virtual bool isAutoConnectEnabled() const override { return (flags & cAutoReconnect) ? true : false; }
123 virtual bool isConnected() const override { return (flags & (cConnected | cListening)) ? true : false; }
124
125 void setConnectTimeout(int64_t milliseconds) { connectTimeout = milliseconds; }
126 void setNoDelay(bool val = true);
127 void shutdown();
128
129 virtual bool connect(const SockaddrIn& addr);
130 virtual bool reconnect() override;
131 virtual bool disconnect() override;
132
133 bool listen(uint16_t port) { return listen(AddrIn((uint32_t)INADDR_ANY), port); }
134 bool listen(AddrIn ip, uint16_t port);
135
136 virtual bool processIncoming() override;
137
138 virtual ConnectionTCP* accept(Socket /*socket*/, const SockaddrIn& /*remoteaddr*/) { return nullptr; }
139
140 private:
141 // Bits 0-15 reserved for ConnectionBase...
142 static constexpr uint32_t cListening = 0x00010000;
143 static constexpr uint32_t cAutoReconnect = 0x00020000;
144 static constexpr uint32_t cNoDelay = 0x00040000;
145 static constexpr uint32_t cConnected = 0x00080000;
146
147 int64_t connectTimeout = 0;
148 };
149 }
150}
151
152#endif
Contains all Cogs related functionality.
Definition: FieldSetter.h:23