network_connect.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. /* $Id: network_connect.c,v 1.16 2001/04/29 18:16:20 kilobug Exp $ */
  2. #include "server.h"
  3. #include <netinet/in.h>
  4. static void gfx_send_map(gfx_client_t *cl)
  5. {
  6. player_t *play;
  7. GSList *l;
  8. int i;
  9. item_t *obj;
  10. net_wr_float(cl->wsock, gl_config->size_x);
  11. net_wr_float(cl->wsock, gl_config->size_y);
  12. net_wr_int(cl->wsock, gl_config->nb_turns);
  13. net_wr_int(cl->wsock, gl_config->turn_num);
  14. net_wr_int(cl->wsock, gl_config->nb_players);
  15. net_wr_int(cl->wsock, gl_config->nb_r4d2);
  16. net_wr_int(cl->wsock, gl_config->nb_akx);
  17. net_wr_string(cl->wsock, gl_config->sand_file);
  18. if (!gfx_get_ack(cl))
  19. return;
  20. for (l = gl_config->players; l != NULL; l = l->next)
  21. {
  22. play = l->data;
  23. net_wr_string(cl->wsock, "PLR");
  24. net_wr_int(cl->wsock, play->team_id);
  25. net_wr_string(cl->wsock, play->name);
  26. net_wr_float(cl->wsock, play->score);
  27. }
  28. if (!gfx_get_ack(cl))
  29. return;
  30. for (i = 0; i < gl_config->nb_objects; i++)
  31. {
  32. obj = gl_objects + i;
  33. net_wr_string(cl->wsock, "OBJ");
  34. net_wr_int(cl->wsock, obj->obj.id);
  35. net_wr_int(cl->wsock, obj->obj.type);
  36. gfx_write_object(cl->wsock, obj);
  37. }
  38. if (!gfx_get_ack(cl))
  39. return;
  40. }
  41. gboolean gfx_new_client(int socket, gboolean master)
  42. {
  43. gfx_client_t *cl;
  44. gfx_t *gfx;
  45. struct sockaddr_in sin;
  46. int sin_len;
  47. int fd;
  48. FILE *file;
  49. struct timeval tv;
  50. int value = 1;
  51. if (!gl_config->gfx)
  52. return TRUE;
  53. if ((!master) && (!gl_config->pub))
  54. return FALSE;
  55. sin_len = sizeof(sin);
  56. if (!master)
  57. fcntl(gl_config->gfx_clients->sock, F_SETFL, O_NONBLOCK);
  58. if ((fd = accept(socket, (struct sockaddr *)&sin, &sin_len)) == -1)
  59. {
  60. if (master)
  61. perror("accept");
  62. return FALSE;
  63. }
  64. setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &value, sizeof(value));
  65. if (!master)
  66. {
  67. fcntl(fd, F_SETFL, 0);
  68. tv.tv_sec = 5;
  69. tv.tv_usec = 0;
  70. setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));
  71. net_set_error_handler(NULL, NULL);
  72. }
  73. else
  74. net_set_error_handler(net_error_abort, NULL);
  75. if (!net_chk_string(fd, "HELLO 42"))
  76. {
  77. close(fd);
  78. return FALSE;
  79. }
  80. file = fdopen(fd, "w");
  81. net_wr_string(file, "HELLO 42");
  82. fflush(file);
  83. if (net_get_int(fd) != PROTOCOL_VERSION)
  84. {
  85. net_send_abort(file);
  86. fclose(file);
  87. return FALSE;
  88. }
  89. net_send_ack(file);
  90. if (net_get_flag(fd) != master)
  91. {
  92. net_send_abort(file);
  93. fclose(file);
  94. return FALSE;
  95. }
  96. net_send_ack(file);
  97. if (!net_wait_ack(fd))
  98. {
  99. net_send_abort(file);
  100. fclose(file);
  101. return FALSE;
  102. }
  103. gfx = gl_config->gfx_clients;
  104. cl = g_malloc(sizeof(*cl));
  105. cl->sock = fd;
  106. cl->wsock = file;
  107. cl->alive = TRUE;
  108. gfx->clients = g_slist_prepend(gfx->clients, cl);
  109. if (master)
  110. {
  111. gfx->master = cl->sock;
  112. gfx->wmaster = cl->wsock;
  113. }
  114. gfx_send_map(cl);
  115. return TRUE;
  116. }