PageRenderTime 87ms CodeModel.GetById 12ms RepoModel.GetById 0ms app.codeStats 0ms

/inet.c

https://gitlab.com/nobody-mb/minecraft-classic-old-bot
C | 174 lines | 137 code | 37 blank | 0 comment | 21 complexity | bc52c00800451d0f736a9f33b7453834 MD5 | raw file
  1. #include "inet.h"
  2. int mc_server_connect (mc_connection *mc)
  3. {
  4. struct sockaddr_in sin;
  5. int ret;
  6. mc->mc_server_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  7. if (inet_pton(AF_INET, (char *)mc->mc_server_address, &sin.sin_addr) < 0) {
  8. mc_disconnect(mc);
  9. return -1;
  10. }
  11. sin.sin_port = htons(mc->mc_server_port);
  12. sin.sin_family = AF_INET;
  13. ret = connect(mc->mc_server_sock, (struct sockaddr *)&sin, sizeof(struct sockaddr_in));
  14. if (ret < 0) {
  15. mc_disconnect(mc);
  16. return -1;
  17. }
  18. return 0;
  19. }
  20. int mc_client_connect (mc_connection *mc)
  21. {
  22. int e = 1, t;
  23. struct sockaddr_in sin;
  24. mc->mc_client_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  25. setsockopt(mc->mc_client_sock,SOL_SOCKET,SO_REUSEADDR,(const char*)&e,sizeof(int));
  26. sin.sin_addr.s_addr = htonl(INADDR_ANY);
  27. sin.sin_port = htons(mc->mc_client_port);
  28. sin.sin_family = AF_INET;
  29. bind (mc->mc_client_sock, (struct sockaddr *)&sin, sizeof(sin));
  30. listen (mc->mc_client_sock, 1);
  31. t = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  32. t = -1;
  33. while (t == -1)
  34. t = accept(mc->mc_client_sock, NULL, NULL);
  35. mc->mc_client_sock = t;
  36. return 0;
  37. }
  38. int mc_bot_startup (const char *name, const char *ip, in_port_t port, const char *mppass)
  39. {
  40. mc_connection *mc = malloc(sizeof(mc_connection));
  41. mc->mc_mode = MC_CLIENT;
  42. mc->mc_server_address = strdup(ip);
  43. mc->mc_client_name = strdup(name);
  44. mc->mc_server_password = strdup(mppass);
  45. mc->mc_server_port = port;
  46. if (mc_server_connect(mc) < 0)
  47. return -1;
  48. printf("Connected to server\n");
  49. mc_server_authenticate(mc, name);
  50. printf("Authenticated\n");
  51. pthread_create(&mc->mc_server_thread, NULL, mc_server_run_listener, mc);
  52. pthread_create(&mc->mc_cmd_thread, NULL, mc_command_run_listener, mc);
  53. pthread_join(mc->mc_server_thread, NULL);
  54. pthread_join(mc->mc_cmd_thread, NULL);
  55. return 0;
  56. }
  57. int mc_proxy_startup (const char *name, const char *ip, in_port_t port, const char *mppass)
  58. {
  59. mc_connection *mc = malloc(sizeof(mc_connection));
  60. mc->mc_mode = MC_TUNNEL;
  61. mc->mc_server_address = strdup(ip);
  62. mc->mc_client_name = strdup(name);
  63. mc->mc_server_password = strdup(mppass);
  64. mc->mc_server_port = port;
  65. mc->mc_client_port = 33344;
  66. if (mc_server_connect(mc) < 0)
  67. return -1;
  68. printf("Connected to server\n");
  69. if (mc_client_connect(mc) < 0)
  70. return -1;
  71. printf("Connected to client\n");
  72. pthread_create(&mc->mc_server_thread, NULL, mc_server_run_listener, mc);
  73. pthread_create(&mc->mc_client_thread, NULL, mc_client_run_listener, mc);
  74. pthread_join(mc->mc_server_thread, NULL);
  75. pthread_join(mc->mc_client_thread, NULL);
  76. return 0;
  77. }
  78. void mc_disconnect (mc_connection *mc)
  79. {
  80. close(mc->mc_server_sock);
  81. close(mc->mc_client_sock);
  82. free((char *)mc->mc_server_address);
  83. free((char *)mc->mc_server_password);
  84. free(mc);
  85. }
  86. char *mc_get_packet(int stc) {
  87. char *buffer;
  88. int i;
  89. ssize_t a;
  90. buffer = malloc(1);
  91. a = recv(stc, buffer, 1, 0);
  92. if (a < 0)
  93. return NULL;
  94. i = packlen(*buffer);
  95. if (i > 1) {
  96. buffer = realloc(buffer, i);
  97. while (a != i-1){
  98. a = recv(stc, buffer+1, i-1, MSG_PEEK);
  99. }
  100. a = recv(stc, buffer+1, i-1, 0);
  101. }
  102. return buffer;
  103. }
  104. void * mc_server_run_listener (void *arg)
  105. {
  106. mc_connection *mc = (mc_connection *)arg;
  107. while(1) {
  108. char *pack_buf = mc_get_packet(mc->mc_server_sock);
  109. if (pack_buf == NULL)
  110. break;
  111. if (mc_server_parse_packet(mc, pack_buf) == MC_SEND && mc->mc_mode & MC_TUNNEL)
  112. send(mc->mc_client_sock,pack_buf,packlen(pack_buf[0]),0);
  113. free(pack_buf);
  114. }
  115. error:
  116. printf("Server connection terminated, quitting...\n");
  117. pthread_cancel(mc->mc_client_thread);
  118. pthread_cancel(mc->mc_server_thread);
  119. return NULL;
  120. }
  121. void * mc_client_run_listener (void *arg)
  122. {
  123. mc_connection *mc = (mc_connection *)arg;
  124. while(1) {
  125. char *pack_buf = mc_get_packet(mc->mc_client_sock);
  126. if (pack_buf == NULL)
  127. break;
  128. if (mc_client_parse_packet(mc, pack_buf) == MC_SEND && mc->mc_mode & MC_TUNNEL)
  129. send(mc->mc_server_sock,pack_buf,packlen(pack_buf[0]),0);
  130. free(pack_buf);
  131. }
  132. error:
  133. printf("Client connection terminated, quitting...\n");
  134. pthread_cancel(mc->mc_client_thread);
  135. pthread_cancel(mc->mc_server_thread);
  136. return NULL;
  137. }