Server.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. #include "libs/enet/include/enet.h"
  2. #include "data/HashMap.h"
  3. #include "network/ENet.h"
  4. #include "network/Server.h"
  5. #include "utils/Logger.h"
  6. static_assert(sizeof(enet_uint16) == sizeof(Server::Port),
  7. "client port has wrong type");
  8. static ENetHost* server;
  9. static HashMap<Server::Client, ENetPeer*> clients;
  10. static Server::Client idCounter = 1;
  11. static Server::OnConnect onConnect = [](Server::Client) {};
  12. static Server::OnDisconnect onDisconnect = [](Server::Client) {};
  13. static Server::OnPacket onPacket = [](Server::Client, InPacket&) {};
  14. Error Server::start(Port port, int maxClients) {
  15. if(server != nullptr) {
  16. return {"already started"};
  17. } else if(ENet::add()) {
  18. return {"cannot initialize enet"};
  19. }
  20. ENetAddress address;
  21. memset(&address, 0, sizeof(ENetAddress));
  22. address.host = ENET_HOST_ANY;
  23. address.port = port;
  24. server = enet_host_create(&address, maxClients, 3, 0, 0);
  25. if(server == nullptr) {
  26. ENet::remove();
  27. return {"cannot create enet server host"};
  28. }
  29. return {};
  30. }
  31. void Server::stop() {
  32. if(server == nullptr) {
  33. return;
  34. }
  35. for(ENetPeer* peer : clients.values()) {
  36. enet_peer_reset(peer);
  37. }
  38. enet_host_destroy(server);
  39. server = nullptr;
  40. ENet::remove();
  41. }
  42. void writeId(ENetPeer* peer, Server::Client id) {
  43. static_assert(sizeof(peer->data) >= sizeof(id),
  44. "private data not big enough for id");
  45. memcpy(&(peer->data), &id, sizeof(id));
  46. }
  47. Server::Client getId(ENetPeer* peer) {
  48. Server::Client id = -1;
  49. memcpy(&id, &(peer->data), sizeof(id));
  50. return id;
  51. }
  52. static void handleConnect(ENetEvent& e) {
  53. Server::Client id = idCounter++;
  54. if(clients.tryEmplace(id, e.peer)) {
  55. LOG_WARNING("id is connected twice");
  56. return;
  57. }
  58. writeId(e.peer, id);
  59. onConnect(id);
  60. }
  61. static void handlePacket(ENetEvent& e) {
  62. if(e.peer->data == nullptr) {
  63. LOG_WARNING("client without data sent package");
  64. return;
  65. }
  66. Server::Client id = getId(e.peer);
  67. InPacket in(e.packet->data, e.packet->dataLength);
  68. onPacket(id, in);
  69. }
  70. static void handleDisconnect(ENetEvent& e) {
  71. if(e.peer->data == nullptr) {
  72. LOG_WARNING("client without data disconnected");
  73. return;
  74. }
  75. Server::Client id = getId(e.peer);
  76. onDisconnect(id);
  77. if(clients.remove(id)) {
  78. LOG_WARNING("removed non existing client");
  79. }
  80. }
  81. void Server::tick() {
  82. if(server == nullptr) {
  83. return;
  84. }
  85. ENetEvent e;
  86. while(enet_host_service(server, &e, 0) > 0) {
  87. switch(e.type) {
  88. case ENET_EVENT_TYPE_CONNECT: handleConnect(e); break;
  89. case ENET_EVENT_TYPE_RECEIVE:
  90. handlePacket(e);
  91. enet_packet_destroy(e.packet);
  92. break;
  93. case ENET_EVENT_TYPE_DISCONNECT_TIMEOUT:
  94. case ENET_EVENT_TYPE_DISCONNECT: handleDisconnect(e); break;
  95. case ENET_EVENT_TYPE_NONE: return;
  96. }
  97. }
  98. }
  99. static ENetPacket* fromBuffer(const Buffer& buffer, int index) {
  100. constexpr enet_uint32 flags[] = {ENET_PACKET_FLAG_RELIABLE, 0,
  101. ENET_PACKET_FLAG_UNSEQUENCED};
  102. return enet_packet_create(buffer, buffer.getLength(), flags[index]);
  103. }
  104. void Server::send(const OutPacket& p, PacketSendMode mode) {
  105. if(server != nullptr) {
  106. int index = static_cast<int>(mode);
  107. enet_host_broadcast(server, index, fromBuffer(p.buffer, index));
  108. }
  109. }
  110. void Server::send(Server::Client client, const OutPacket& p,
  111. PacketSendMode mode) {
  112. if(server == nullptr) {
  113. return;
  114. }
  115. ENetPeer** peer = clients.search(client);
  116. if(peer != nullptr) {
  117. int index = static_cast<int>(mode);
  118. enet_peer_send(*peer, index, fromBuffer(p.buffer, index));
  119. }
  120. }
  121. void Server::disconnect(Client client) {
  122. ENetPeer** peer = clients.search(client);
  123. if(peer != nullptr) {
  124. enet_peer_disconnect(*peer, 0);
  125. }
  126. }
  127. void Server::setConnectHandler(OnConnect oc) {
  128. onConnect = oc;
  129. }
  130. void Server::setDisconnectHandler(OnDisconnect od) {
  131. onDisconnect = od;
  132. }
  133. void Server::setPacketHandler(OnPacket op) {
  134. onPacket = op;
  135. }
  136. void Server::resetHandler() {
  137. onConnect = [](Server::Client) {};
  138. onDisconnect = [](Server::Client) {};
  139. onPacket = [](Server::Client, InPacket&) {};
  140. }