connections.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. #include <cstdio>
  2. #include <cstring>
  3. #include "OS.h"
  4. #include "MallocAllocator.h"
  5. #include "BitMessage.h"
  6. #include "AsyncConnection.h"
  7. #include "PacketQueue.h"
  8. using namespace crown;
  9. const unsigned int server_port = 30000;
  10. const unsigned int client_port = 30001;
  11. const uint32_t protocol_id = 0x00;
  12. const float delta_time = 1.0f / 45.0f;
  13. const real send_rate = 1.0f / 45.0f;
  14. const float time_out = 10.0f;
  15. enum Mode
  16. {
  17. SERVER,
  18. CLIENT
  19. };
  20. int main(int argc, char** argv)
  21. {
  22. if (argc != 2)
  23. {
  24. os::printf("Usage: ./connections server/client.\n");
  25. return -1;
  26. }
  27. bool connected = false;
  28. real send_acc = 0.0f;
  29. Mode mode = SERVER;
  30. os::NetAddress addr(127, 0, 0, 1, server_port);
  31. // creates connection
  32. MallocAllocator alloc;
  33. network::AsyncConnection connection(alloc);
  34. if (strcmp(argv[1], "server") == 0)
  35. {
  36. mode = SERVER;
  37. }
  38. else if (strcmp(argv[1], "client") == 0)
  39. {
  40. mode = CLIENT;
  41. }
  42. else
  43. {
  44. os::printf("Usage: ./connections server/client.\n");
  45. return -1;
  46. }
  47. uint16_t port = mode == SERVER ? server_port : client_port;
  48. // connection init
  49. connection.init(protocol_id, 10.0f);
  50. //connection start
  51. if (!connection.start(port))
  52. {
  53. os::printf("Couldn't start connection on port %d\n", port);
  54. return -1;
  55. }
  56. if (mode == CLIENT)
  57. {
  58. connection.connect(addr);
  59. }
  60. else if (mode == SERVER)
  61. {
  62. connection.listen();
  63. }
  64. // main loop
  65. while (true)
  66. {
  67. if (!connected && connection.is_connected())
  68. {
  69. os::printf("Client connected to server\n");
  70. connected = true;
  71. }
  72. if (!connected && connection.is_connect_fail())
  73. {
  74. os::printf("Connection failed\n");
  75. break;
  76. }
  77. send_acc += delta_time;
  78. if (mode == SERVER)
  79. {
  80. while (true)
  81. {
  82. network::BitMessage received(alloc);
  83. received.init(6);
  84. int32_t bytes = connection.receive_message(received, delta_time);
  85. if (bytes > 0)
  86. {
  87. uint8_t* header = received.get_header();
  88. uint32_t protocol_id = header[0] << 24 | header[1] << 16 | header[2] << 8 | header[3];
  89. uint16_t sequence = header[4] << 8 | header[5];
  90. uint16_t ack = header[6] << 8 | header[7];
  91. uint32_t ack_bits = header[8] << 24 | header[9] << 16 | header[10] << 8 | header[11];
  92. char string[6];
  93. received.read_string(string, 6);
  94. os::printf("------------------\n");
  95. os::printf("protocol_id: %d\n", protocol_id);
  96. os::printf("sequence: %d\n", sequence);
  97. os::printf("ack: %d\n", ack);
  98. os::printf("ack_bits: %d\n", ack_bits);
  99. os::printf("data: %s\n", string);
  100. os::printf("------------------\n");
  101. }
  102. if (bytes <= 0)
  103. {
  104. break;
  105. }
  106. }
  107. }
  108. if (mode == CLIENT)
  109. {
  110. while (send_acc > 1 / send_rate)
  111. {
  112. network::BitMessage message(alloc);
  113. message.init(6);
  114. message.begin_writing();
  115. message.write_string("prova", 6);
  116. connection.send_message(message, delta_time);
  117. uint8_t* header = message.get_header();
  118. uint32_t protocol_id = header[0] << 24 | header[1] << 16 | header[2] << 8 | header[3];
  119. uint16_t sequence = header[4] << 8 | header[5];
  120. uint16_t ack = header[6] << 8 | header[7];
  121. uint32_t ack_bits = header[8] << 24 | header[9] << 16 | header[10] << 8 | header[11];
  122. os::printf("------------------\n");
  123. os::printf("protocol_id: %d\n", protocol_id);
  124. os::printf("sequence: %d\n", sequence);
  125. os::printf("ack: %d\n", ack);
  126. os::printf("ack_bits: %d\n", ack_bits);
  127. os::printf("------------------\n");
  128. send_acc -= 1.0f / send_rate;
  129. }
  130. }
  131. }
  132. connection.stop();
  133. }