Network.cppm 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. export module Core.Network;
  2. export import Core.Buffer;
  3. export import Core.Types;
  4. import Core.UniquePointer;
  5. export namespace Core {
  6. enum class PacketSendMode { RELIABLE, SEQUENCED, UNSEQUENCED };
  7. class InPacket {
  8. const char* data;
  9. size_t size;
  10. size_t index;
  11. public:
  12. InPacket(const void* data, size_t n);
  13. InPacket(const InPacket&) = delete;
  14. InPacket(InPacket&&) = delete;
  15. InPacket& operator=(const InPacket&) = delete;
  16. InPacket& operator=(InPacket&&) = delete;
  17. bool readU8(u8& u);
  18. bool readU16(u16& u);
  19. bool readU32(u32& u);
  20. bool readI8(i8& i);
  21. bool readI16(i16& i);
  22. bool readI32(i32& i);
  23. bool readFloat(float& f);
  24. size_t readString(char* buffer, size_t n);
  25. bool read(void* buffer, size_t n);
  26. };
  27. struct OutPacket {
  28. Buffer data{};
  29. void writeU8(u8 u);
  30. void writeU16(u16 u);
  31. void writeU32(u32 u);
  32. void writeI8(i8 i);
  33. void writeI16(i16 i);
  34. void writeI32(i32 i);
  35. void writeFloat(float f);
  36. void writeString(const char* buffer);
  37. void write(const void* buffer, size_t n);
  38. };
  39. using Port = u16;
  40. using OnServerConnect = void (*)();
  41. using OnServerDisconnect = void (*)();
  42. using OnServerPacket = void (*)(InPacket&);
  43. struct Client final {
  44. Client();
  45. ~Client();
  46. bool start();
  47. void stop();
  48. bool connect(const char* server, Port port, int timeoutTicks);
  49. void setTimeout(u32 timeout, u32 timeoutMin, u32 timeoutMax);
  50. void disconnect(int timeoutTicks);
  51. void sendPacket(const OutPacket& p, PacketSendMode mode);
  52. void tick();
  53. void setConnectHandler(OnServerConnect oc);
  54. void setDisconnectHandler(OnServerDisconnect od);
  55. void setPacketHandler(OnServerPacket op);
  56. void resetHandler();
  57. bool isConnecting();
  58. bool isConnected();
  59. struct Data;
  60. private:
  61. UniquePointer<Data> data;
  62. };
  63. struct Server;
  64. using ClientHandle = int;
  65. using OnClientConnect = void (*)(Server&, ClientHandle);
  66. using OnClientDisconnect = void (*)(Server&, ClientHandle);
  67. using OnClientPacket = void (*)(Server&, ClientHandle, InPacket&);
  68. struct Server final {
  69. Server();
  70. ~Server();
  71. bool start(Port port, size_t maxClients);
  72. void stop();
  73. void tick();
  74. void sendPacketBroadcast(const OutPacket& p, PacketSendMode mode);
  75. void sendPacket(
  76. ClientHandle client, const OutPacket& p, PacketSendMode mode);
  77. void setTimeout(
  78. ClientHandle client, u32 timeout, u32 timeoutMin, u32 timeoutMax);
  79. void disconnectClient(ClientHandle client);
  80. void setConnectHandler(OnClientConnect oc);
  81. void setDisconnectHandler(OnClientDisconnect od);
  82. void setPacketHandler(OnClientPacket op);
  83. void resetHandler();
  84. struct Data;
  85. private:
  86. UniquePointer<Data> data;
  87. };
  88. }