MultiPlayer.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. #include <stdio.h>
  2. #include <sys/socket.h>
  3. #include <netdb.h>
  4. #include <errno.h>
  5. #include <string.h>
  6. #include <netinet/in.h>
  7. #include <arpa/inet.h>
  8. #include <unistd.h>
  9. #include "scufeng/log.h"
  10. #include "MultiPlayer.h"
  11. MultiPlayer MultiPlayer_alloc(
  12. const char *server_host,
  13. const uint16_t server_port
  14. ) {
  15. MultiPlayer mp;
  16. struct protoent *proto = getprotobyname("tcp");
  17. mp.sock = socket(AF_INET, SOCK_STREAM, proto->p_proto);
  18. if (mp.sock == -1) {
  19. LOG_FATALF("socket failed: %d %s", errno, strerror(errno));
  20. }
  21. struct in_addr server_addr;
  22. int res = inet_aton(server_host, &server_addr);
  23. if (res == 0) {
  24. LOG_FATAL("inet_aton failed");
  25. }
  26. struct sockaddr_in server_sockaddr = {
  27. .sin_family = AF_INET,
  28. .sin_addr = server_addr,
  29. .sin_port = htons(server_port)
  30. };
  31. res = connect(
  32. mp.sock,
  33. (struct sockaddr *) &server_sockaddr,
  34. sizeof(server_sockaddr)
  35. );
  36. if (res == -1) {
  37. LOG_FATALF("connect failed: %d %s", errno, strerror(errno));
  38. }
  39. mp.conn_s = fdopen(mp.sock, "r+");
  40. if (mp.conn_s == nullptr) {
  41. LOG_FATALF("fdopen failed: (%d) %s", errno, strerror(errno));
  42. }
  43. return mp;
  44. }
  45. void MultiPlayer_free(MultiPlayer *const mp) {
  46. fclose(mp->conn_s);
  47. mp->conn_s = nullptr;
  48. close(mp->conn);
  49. mp->conn = 0;
  50. close(mp->sock);
  51. mp->sock = 0;
  52. }
  53. void MultiPlayer_tick(MultiPlayer *const mp) {
  54. char buf[1024] = { 0 };
  55. const size_t buf_size = sizeof(buf) / sizeof(buf[0]);
  56. printf("Write msg: ");
  57. fgets(buf, buf_size, stdin);
  58. const size_t msg_len = strlen(buf) - 1;
  59. size_t items_written = fwrite(&msg_len, sizeof(msg_len), 1, mp->conn_s);
  60. if (items_written < 1) {
  61. LOG_FATALF("fwrite failed to write msg_len %zu", items_written);
  62. }
  63. if (fflush(mp->conn_s) == EOF) {
  64. LOG_FATAL("fflush failed at msg_len");
  65. }
  66. printf("Sent %zu items\n", items_written);
  67. items_written = fwrite(buf, msg_len, 1, mp->conn_s);
  68. if (items_written < 1) {
  69. LOG_FATALF("fwrite failed to write msg %zu", items_written);
  70. }
  71. if (fflush(mp->conn_s) == EOF) {
  72. LOG_FATAL("fflush failed at msg");
  73. }
  74. printf("Sent %zu items\n", items_written);
  75. // ssize_t res = send(mp->sock, buf, strlen(buf) - 1, 0);
  76. // if (res == -1) {
  77. // LOG_ERRORF("send failed: %d %s", errno, strerror(errno));
  78. // return;
  79. // }
  80. // printf("Sent %zu bytes\n", res);
  81. }