networking.c 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. #include <string.h>
  2. #include "scufeng/log.h"
  3. #include "networking.h"
  4. static const uint8_t fb = 0xfb;
  5. static const uint8_t fe = 0xfe;
  6. void PaddleChangeDirMsg_encode(const PaddleChangeDirMsg *const msg, uint8_t *buf, const size_t buf_size) {
  7. if (buf_size < PADDLE_CHANGE_DIR_MSG_ENCODED_SIZE) {
  8. LOG_FATALF("Buffer size too small (%zu), %zu required.", buf_size, PADDLE_CHANGE_DIR_MSG_ENCODED_SIZE);
  9. }
  10. memcpy(buf, &msg->dir, sizeof(msg->dir));
  11. buf += sizeof(msg->dir);
  12. memcpy(buf, &msg->player1, sizeof(msg->player1));
  13. }
  14. PaddleChangeDirMsg PaddleChangeDir_decode(const uint8_t *buf, const size_t buf_size) {
  15. if (buf_size < PADDLE_CHANGE_DIR_MSG_ENCODED_SIZE) {
  16. LOG_FATALF("Buffer size too small (%zu), %zu required.", buf_size, PADDLE_CHANGE_DIR_MSG_ENCODED_SIZE);
  17. }
  18. PaddleChangeDirMsg msg = {0};
  19. memcpy(&msg.dir, buf, sizeof(msg.dir));
  20. buf += sizeof(msg.dir);
  21. memcpy(&msg.player1, buf, sizeof(msg.player1));
  22. return msg;
  23. }
  24. void send_msg(FILE *s, const uint8_t *const buf, const size_t buf_size) {
  25. uint8_t *buf_cpy = (uint8_t *) malloc(sizeof(uint8_t) * buf_size);
  26. memcpy(buf_cpy, buf, buf_size);
  27. for (uint8_t *p = buf_cpy; p < buf_cpy + buf_size; p++) {
  28. if (*p == fb || *p == fe) {
  29. *p += SEND_FRAME_MANGLE;
  30. }
  31. }
  32. if (fwrite(&fb, sizeof(fb), 1, s) < 1) {
  33. LOG_FATAL("[send_msg] Failed to write fb");
  34. }
  35. if (fwrite(&buf_size, sizeof(buf_size), 1, s) < 1) {
  36. LOG_FATAL("[send_msg] Failed to write msg_len");
  37. }
  38. if (fwrite(buf_cpy, buf_size, 1, s) < 1) {
  39. LOG_FATAL("[send_msg] Failed to write msg");
  40. }
  41. if (fwrite(&fe, sizeof(fe), 1, s) < 1) {
  42. LOG_FATAL("[send_msg] Failed to write fe");
  43. }
  44. if (fflush(s) != 0) {
  45. LOG_FATAL("[send_msg] Failed to flush stream");
  46. }
  47. free(buf_cpy);
  48. }
  49. bool recv_msg(FILE *s, uint8_t *const buf, const size_t buf_size) {
  50. uint8_t _fb;
  51. if (fread(&_fb, sizeof(_fb), 1, s) < 1) {
  52. LOG_FATAL("[recv_msg] Failed to read _fb");
  53. }
  54. if (_fb != fb) {
  55. return false;
  56. }
  57. size_t msg_len;
  58. if (fread(&msg_len, sizeof(msg_len), 1, s) < 1) {
  59. LOG_FATAL("[recv_msg] Failed to read msg_len");
  60. }
  61. if (buf_size < msg_len) {
  62. LOG_FATALF("[recv_msg] Buffer too small. msg_len: %zu, buf_size: %zu", msg_len, buf_size);
  63. }
  64. if (fread(buf, buf_size, 1, s) < 1) {
  65. LOG_FATAL("[recv_msg] Failed to read msg");
  66. }
  67. for (uint8_t *p = buf; p < buf + buf_size; p++) {
  68. if (*p == fb + SEND_FRAME_MANGLE || *p == fe + SEND_FRAME_MANGLE) {
  69. *p += RECV_FRAME_MANGLE;
  70. }
  71. }
  72. uint8_t _fe;
  73. if (fread(&_fe, sizeof(_fe), 1, s) < 1) {
  74. LOG_FATAL("[recv_msg] Failed to read _fe");
  75. }
  76. if (_fe != fe) {
  77. return false;
  78. }
  79. return true;
  80. }