Network.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500
  1. #include "core/Network.h"
  2. #define ENET_IMPLEMENTATION
  3. #include <enet.h>
  4. #include <string.h>
  5. typedef CoreOutPacket OutPacket;
  6. void coreInitInPacket(CoreInPacket* in, const void* data, size_t n) {
  7. in->data = data;
  8. in->size = n;
  9. in->index = 0;
  10. }
  11. bool coreInPacketReadU8(CoreInPacket* in, u8* u) {
  12. return coreInPacketRead(in, u, sizeof(*u));
  13. }
  14. bool coreInPacketReadU16(CoreInPacket* in, u16* u) {
  15. if(coreInPacketRead(in, u, sizeof(*u))) {
  16. return true;
  17. }
  18. *u = ntohs(*u);
  19. return false;
  20. }
  21. bool coreInPacketReadU32(CoreInPacket* in, u32* u) {
  22. if(coreInPacketRead(in, u, sizeof(*u))) {
  23. return true;
  24. }
  25. *u = ntohl(*u);
  26. return false;
  27. }
  28. bool coreInPacketReadI8(CoreInPacket* in, i8* i) {
  29. u8 u;
  30. if(coreInPacketReadU8(in, &u)) {
  31. return true;
  32. }
  33. *i = (i8)((i32)u - (i32)128);
  34. return false;
  35. }
  36. bool coreInPacketReadI16(CoreInPacket* in, i16* i) {
  37. u16 u;
  38. if(coreInPacketReadU16(in, &u)) {
  39. return true;
  40. }
  41. *i = (i16)((i32)u - (i32)32768);
  42. return false;
  43. }
  44. bool coreInPacketReadI32(CoreInPacket* in, i32* i) {
  45. u32 u;
  46. if(coreInPacketReadU32(in, &u)) {
  47. return true;
  48. }
  49. if(u < 2147483648) {
  50. *i = (i32)((i32)u - (i32)2147483648);
  51. } else {
  52. *i = (i32)(u - (u32)2147483648);
  53. }
  54. return false;
  55. }
  56. bool coreInPacketReadFloat(CoreInPacket* in, float* f) {
  57. u32 u;
  58. static_assert(sizeof(u) == sizeof(*f), "float and u32 size do not match");
  59. if(coreInPacketReadU32(in, &u)) {
  60. return true;
  61. }
  62. memcpy(f, &u, sizeof(float));
  63. return false;
  64. }
  65. size_t coreInPacketReadString(CoreInPacket* in, char* buffer, size_t n) {
  66. if(n == 0) {
  67. return 0;
  68. }
  69. u16 size;
  70. if(coreInPacketReadU16(in, &size)) {
  71. return 0;
  72. }
  73. size_t end = size;
  74. char* bufferStart = buffer;
  75. n--;
  76. while(n-- > 0 && end-- > 0) {
  77. u8 u;
  78. if(coreInPacketReadU8(in, &u)) {
  79. *bufferStart = '\0';
  80. break;
  81. }
  82. *(buffer++) = (char)u;
  83. }
  84. while(end-- > 0 && !coreInPacketReadU8(in, &(u8){0})) {}
  85. *buffer = '\0';
  86. return size;
  87. }
  88. bool coreInPacketRead(CoreInPacket* in, void* buffer, size_t n) {
  89. if(in->index + n > in->size) {
  90. return true;
  91. }
  92. memcpy(buffer, in->data + in->index, n);
  93. in->index += n;
  94. return false;
  95. }
  96. void coreInitOutPacket(OutPacket* out) {
  97. coreInitBuffer(&out->data);
  98. }
  99. void coreDestroyOutPacket(OutPacket* out) {
  100. coreDestroyBuffer(&out->data);
  101. }
  102. OutPacket* coreOutPacketWriteU8(OutPacket* out, u8 u) {
  103. coreAddSizedBufferData(&out->data, &u, sizeof(u));
  104. return out;
  105. }
  106. OutPacket* coreOutPacketWriteU16(OutPacket* out, u16 u) {
  107. u = htons(u);
  108. coreAddSizedBufferData(&out->data, &u, sizeof(u));
  109. return out;
  110. }
  111. OutPacket* coreOutPacketWriteU32(OutPacket* out, u32 u) {
  112. u = htonl(u);
  113. coreAddSizedBufferData(&out->data, &u, sizeof(u));
  114. return out;
  115. }
  116. OutPacket* coreOutPacketWriteI8(OutPacket* out, i8 i) {
  117. if(i < 0) {
  118. return coreOutPacketWriteU8(out, (u8)((i32)i + (i32)128));
  119. }
  120. return coreOutPacketWriteU8(out, (u8)((u32)i + (u32)128));
  121. }
  122. OutPacket* coreOutPacketWriteI16(OutPacket* out, i16 i) {
  123. if(i < 0) {
  124. return coreOutPacketWriteU16(out, (u16)((i32)i + (i32)32768));
  125. }
  126. return coreOutPacketWriteU16(out, (u16)((u32)i + (u32)32768));
  127. }
  128. OutPacket* coreOutPacketWriteI32(OutPacket* out, i32 i) {
  129. if(i < 0) {
  130. return coreOutPacketWriteU32(out, (u32)(i + (i32)2147483648));
  131. }
  132. return coreOutPacketWriteU32(out, (u32)((u32)i + (u32)2147483648));
  133. }
  134. OutPacket* coreOutPacketWriteFloat(OutPacket* out, float f) {
  135. u32 u;
  136. static_assert(sizeof(u) == sizeof(f), "float and u32 size do not match");
  137. memcpy(&u, &f, sizeof(float));
  138. return coreOutPacketWriteU32(out, u);
  139. }
  140. OutPacket* coreOutPacketWriteString(OutPacket* out, const char* s, size_t n) {
  141. size_t end = n > 65535 ? 65535 : n;
  142. coreOutPacketWriteU16(out, (u16)end);
  143. for(size_t i = 0; i < end; i++) {
  144. coreOutPacketWriteU8(out, (u8)(*(s++)));
  145. }
  146. return out;
  147. }
  148. OutPacket* coreOutPacketWrite(OutPacket* out, const void* buffer, size_t n) {
  149. coreAddSizedBufferData(&out->data, buffer, n);
  150. return out;
  151. }
  152. /*static int enetCounter = 0;
  153. bool ENet::add() {
  154. if(enetCounter == 0 && enet_initialize() != 0) {
  155. return true;
  156. }
  157. enetCounter++;
  158. return false;
  159. }
  160. void ENet::remove() {
  161. if(enetCounter > 0 && --enetCounter == 0) {
  162. enet_deinitialize();
  163. }
  164. }
  165. static_assert(sizeof(enet_uint16) == sizeof(Client::Port),
  166. "client port has wrong type");
  167. static ENetHost* client = nullptr;
  168. static ENetPeer* connection = nullptr;
  169. static int connectTicks = 0;
  170. static int connectTimeoutTicks = 0;
  171. static int disconnectTicks = 0;
  172. static int disconnectTimeoutTicks = 0;
  173. static Client::OnConnect onConnect = []() {};
  174. static Client::OnDisconnect onDisconnect = []() {};
  175. static Client::OnPacket onPacket = [](InPacket&) {};
  176. Error Client::start() {
  177. if(client != nullptr) {
  178. return {"already started"};
  179. } else if(ENet::add()) {
  180. return {"cannot initialize enet"};
  181. }
  182. client = enet_host_create(nullptr, 1, 2, 0, 0);
  183. if(client == nullptr) {
  184. ENet::remove();
  185. return {"cannot create enet client host"};
  186. }
  187. return {};
  188. }
  189. void Client::stop() {
  190. if(connection != nullptr) {
  191. onDisconnect();
  192. enet_peer_disconnect_now(connection, 0);
  193. connection = nullptr;
  194. }
  195. if(client != nullptr) {
  196. enet_host_destroy(client);
  197. ENet::remove();
  198. client = nullptr;
  199. }
  200. connectTicks = 0;
  201. disconnectTicks = 0;
  202. }
  203. Error Client::connect(const char* server, Port port, int timeoutTicks) {
  204. if(client == nullptr) {
  205. return {"client not started"};
  206. } else if(connection != nullptr) {
  207. return {"connection already exists"};
  208. }
  209. ENetAddress address;
  210. memset(&address, 0, sizeof(ENetAddress));
  211. enet_address_set_host(&address, server);
  212. address.port = port;
  213. connection = enet_host_connect(client, &address, 3, 0);
  214. if(connection == nullptr) {
  215. return {"cannot create connection"};
  216. }
  217. connectTicks = 1;
  218. connectTimeoutTicks = timeoutTicks;
  219. return {};
  220. }
  221. void Client::disconnect(int timeoutTicks) {
  222. if(connection == nullptr) {
  223. return;
  224. }
  225. connectTicks = 0;
  226. enet_peer_disconnect(connection, 0);
  227. disconnectTicks = 1;
  228. disconnectTimeoutTicks = timeoutTicks;
  229. }
  230. void Client::send(OutPacket& p, PacketSendMode mode) {
  231. if(client != nullptr && connection != nullptr && connectTicks < 0) {
  232. constexpr enet_uint32 flags[] = {ENET_PACKET_FLAG_RELIABLE, 0,
  233. ENET_PACKET_FLAG_UNSEQUENCED};
  234. enet_uint8 index = static_cast<enet_uint8>(mode);
  235. enet_peer_send(connection, index,
  236. enet_packet_create(
  237. p.buffer,
  238. static_cast<size_t>(p.buffer.getLength()), flags[index]));
  239. }
  240. }
  241. void Client::tick() {
  242. if(client == nullptr) {
  243. return;
  244. }
  245. ENetEvent e;
  246. while(enet_host_service(client, &e, 0) > 0) {
  247. switch(e.type) {
  248. case ENET_EVENT_TYPE_CONNECT:
  249. connectTicks = -1;
  250. onConnect();
  251. break;
  252. case ENET_EVENT_TYPE_DISCONNECT_TIMEOUT:
  253. case ENET_EVENT_TYPE_DISCONNECT:
  254. disconnectTicks = 0;
  255. onDisconnect();
  256. connection = nullptr;
  257. break;
  258. case ENET_EVENT_TYPE_NONE: return;
  259. case ENET_EVENT_TYPE_RECEIVE:
  260. InPacket in(e.packet->data,
  261. static_cast<int>(e.packet->dataLength));
  262. onPacket(in);
  263. enet_packet_destroy(e.packet);
  264. break;
  265. }
  266. }
  267. if(connectTicks >= 1 && ++connectTicks > connectTimeoutTicks) {
  268. connectTicks = 0;
  269. disconnect(connectTimeoutTicks);
  270. }
  271. if(disconnectTicks >= 1 && ++disconnectTicks > disconnectTimeoutTicks) {
  272. disconnectTicks = 0;
  273. onDisconnect();
  274. if(connection != nullptr) {
  275. enet_peer_reset(connection);
  276. connection = nullptr;
  277. }
  278. }
  279. }
  280. void Client::setConnectHandler(OnConnect oc) {
  281. onConnect = oc;
  282. }
  283. void Client::setDisconnectHandler(OnDisconnect od) {
  284. onDisconnect = od;
  285. }
  286. void Client::setPacketHandler(OnPacket op) {
  287. onPacket = op;
  288. }
  289. void Client::resetHandler() {
  290. onConnect = []() {};
  291. onDisconnect = []() {};
  292. onPacket = [](InPacket&) {};
  293. }
  294. bool Client::isConnecting() {
  295. return connectTicks >= 1;
  296. }
  297. bool Client::isConnected() {
  298. return connectTicks < 0;
  299. }
  300. static_assert(sizeof(enet_uint16) == sizeof(Server::Port),
  301. "client port has wrong type");
  302. static ENetHost* server;
  303. static HashMap<Server::Client, ENetPeer*> clients;
  304. static Server::Client idCounter = 1;
  305. static Server::OnConnect onConnect = [](Server::Client) {};
  306. static Server::OnDisconnect onDisconnect = [](Server::Client) {};
  307. static Server::OnPacket onPacket = [](Server::Client, InPacket&) {};
  308. Error Server::start(Port port, int maxClients) {
  309. if(maxClients <= 0) {
  310. return {"invalid max client amount"};
  311. } else if(server != nullptr) {
  312. return {"already started"};
  313. } else if(ENet::add()) {
  314. return {"cannot initialize enet"};
  315. }
  316. ENetAddress address;
  317. memset(&address, 0, sizeof(ENetAddress));
  318. address.host = ENET_HOST_ANY;
  319. address.port = port;
  320. server = enet_host_create(&address, static_cast<unsigned
  321. int>(maxClients), 3, 0, 0); if(server == nullptr) { ENet::remove(); return
  322. {"cannot create enet server host"};
  323. }
  324. return {};
  325. }
  326. void Server::stop() {
  327. if(server == nullptr) {
  328. return;
  329. }
  330. for(ENetPeer* peer : clients.values()) {
  331. enet_peer_reset(peer);
  332. }
  333. enet_host_destroy(server);
  334. server = nullptr;
  335. ENet::remove();
  336. }
  337. static void writeId(ENetPeer* peer, Server::Client id) {
  338. static_assert(sizeof(peer->data) >= sizeof(id),
  339. "private data not big enough for id");
  340. memcpy(&(peer->data), &id, sizeof(id));
  341. }
  342. static Server::Client getId(ENetPeer* peer) {
  343. Server::Client id = -1;
  344. memcpy(&id, &(peer->data), sizeof(id));
  345. return id;
  346. }
  347. static void handleConnect(ENetEvent& e) {
  348. Server::Client id = idCounter++;
  349. if(clients.tryEmplace(id, e.peer)) {
  350. LOG_WARNING("id is connected twice");
  351. return;
  352. }
  353. writeId(e.peer, id);
  354. onConnect(id);
  355. }
  356. static void handlePacket(ENetEvent& e) {
  357. if(e.peer->data == nullptr) {
  358. LOG_WARNING("client without data sent package");
  359. return;
  360. }
  361. Server::Client id = getId(e.peer);
  362. InPacket in(e.packet->data, static_cast<int>(e.packet->dataLength));
  363. onPacket(id, in);
  364. }
  365. static void handleDisconnect(ENetEvent& e) {
  366. if(e.peer->data == nullptr) {
  367. LOG_WARNING("client without data disconnected");
  368. return;
  369. }
  370. Server::Client id = getId(e.peer);
  371. onDisconnect(id);
  372. if(clients.remove(id)) {
  373. LOG_WARNING("removed non existing client");
  374. }
  375. }
  376. void Server::tick() {
  377. if(server == nullptr) {
  378. return;
  379. }
  380. ENetEvent e;
  381. while(enet_host_service(server, &e, 0) > 0) {
  382. switch(e.type) {
  383. case ENET_EVENT_TYPE_CONNECT: handleConnect(e); break;
  384. case ENET_EVENT_TYPE_RECEIVE:
  385. handlePacket(e);
  386. enet_packet_destroy(e.packet);
  387. break;
  388. case ENET_EVENT_TYPE_DISCONNECT_TIMEOUT:
  389. case ENET_EVENT_TYPE_DISCONNECT: handleDisconnect(e); break;
  390. case ENET_EVENT_TYPE_NONE: return;
  391. }
  392. }
  393. }
  394. static ENetPacket* fromBuffer(const Buffer& buffer, int index) {
  395. constexpr enet_uint32 flags[] = {ENET_PACKET_FLAG_RELIABLE, 0,
  396. ENET_PACKET_FLAG_UNSEQUENCED};
  397. return enet_packet_create(
  398. buffer, static_cast<unsigned int>(buffer.getLength()),
  399. flags[index]);
  400. }
  401. void Server::send(const OutPacket& p, PacketSendMode mode) {
  402. if(server != nullptr) {
  403. int index = static_cast<int>(mode);
  404. enet_host_broadcast(server, static_cast<enet_uint8>(index),
  405. fromBuffer(p.buffer, index));
  406. }
  407. }
  408. void Server::send(Server::Client client, const OutPacket& p,
  409. PacketSendMode mode) {
  410. if(server == nullptr) {
  411. return;
  412. }
  413. ENetPeer** peer = clients.search(client);
  414. if(peer != nullptr) {
  415. int index = static_cast<int>(mode);
  416. enet_peer_send(*peer, static_cast<enet_uint8>(index),
  417. fromBuffer(p.buffer, index));
  418. }
  419. }
  420. void Server::disconnect(Client client) {
  421. ENetPeer** peer = clients.search(client);
  422. if(peer != nullptr) {
  423. enet_peer_disconnect(*peer, 0);
  424. }
  425. }
  426. void Server::setConnectHandler(OnConnect oc) {
  427. onConnect = oc;
  428. }
  429. void Server::setDisconnectHandler(OnDisconnect od) {
  430. onDisconnect = od;
  431. }
  432. void Server::setPacketHandler(OnPacket op) {
  433. onPacket = op;
  434. }
  435. void Server::resetHandler() {
  436. onConnect = [](Server::Client) {};
  437. onDisconnect = [](Server::Client) {};
  438. onPacket = [](Server::Client, InPacket&) {};
  439. }*/