main.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. #include <stdio.h>
  2. #include <enet/enet.h>
  3. #include <string.h>
  4. ENetPeer* mypeers[2]={0,0};
  5. ENetAddress clientAddresses[2];
  6. int numpeers=0;
  7. int main(int argc, char* argv[])
  8. {
  9. fprintf(stderr,"starting enet dedicated server\n");
  10. if (enet_initialize () != 0)
  11. {
  12. fprintf (stderr, "An error occurred while initializing ENet.\n");
  13. return EXIT_FAILURE;
  14. }
  15. atexit (enet_deinitialize);
  16. ENetAddress address;
  17. ENetHost * server;
  18. /* Bind the server to the default localhost. */
  19. /* A specific host address can be specified by */
  20. /* enet_address_set_host (& address, "x.x.x.x"); */
  21. address.host = ENET_HOST_ANY;
  22. /* Bind the server to port 1234. */
  23. address.port = 1234;
  24. server = enet_host_create (& address /* the address to bind the server host to */,
  25. 32 /* allow up to 32 clients and/or outgoing connections */,
  26. 2 /* allow up to 2 channels to be used, 0 and 1 */,
  27. 0 /* assume any amount of incoming bandwidth */,
  28. 0 /* assume any amount of outgoing bandwidth */);
  29. if (server == NULL)
  30. {
  31. fprintf (stderr,
  32. "An error occurred while trying to create an ENet server host.\n");
  33. exit (EXIT_FAILURE);
  34. }
  35. ENetEvent event;
  36. /* Wait up to 10000000 milliseconds for an event. */
  37. while (enet_host_service (server, & event, 10000000) > 0)
  38. {
  39. switch (event.type)
  40. {
  41. case ENET_EVENT_TYPE_CONNECT:
  42. char clientname[1024];
  43. enet_address_get_host(&event.peer -> address,clientname, 1024);
  44. printf ("A new client connected from %s:%u.\n",
  45. clientname,
  46. event.peer -> address.port);
  47. /* Store any relevant client information here. */
  48. event.peer -> data = (char*)"Client information";
  49. if (numpeers<2)
  50. {
  51. clientAddresses[numpeers] = event.peer->address;
  52. mypeers[numpeers] = event.peer;
  53. }
  54. numpeers++;
  55. if (numpeers==2)
  56. {
  57. printf("exchanging addresses for NAT punchthrough\n");
  58. //exchange the address info
  59. for (int i=0;i<2;i++)
  60. {
  61. int sz = sizeof(ENetAddress);
  62. /* Create a reliable packet of size 7 containing "packet\0" */
  63. ENetPacket * packet = enet_packet_create (&clientAddresses[i],
  64. sz,
  65. ENET_PACKET_FLAG_RELIABLE);
  66. enet_peer_send (mypeers[1-i], 0, packet);
  67. }
  68. //prepare for the next pair of clients to connect/NAT punchthrough
  69. numpeers=0;
  70. }
  71. break;
  72. case ENET_EVENT_TYPE_RECEIVE:
  73. printf ("A packet of length %u containing %s was received from %s on channel %u.\n",
  74. event.packet -> dataLength,
  75. event.packet -> data,
  76. event.peer -> data,
  77. event.channelID);
  78. /* Clean up the packet now that we're done using it. */
  79. enet_packet_destroy (event.packet);
  80. break;
  81. case ENET_EVENT_TYPE_DISCONNECT:
  82. printf ("%s disconected.\n", event.peer -> data);
  83. /* Reset the peer's client information. */
  84. event.peer -> data = NULL;
  85. }
  86. }
  87. enet_host_destroy(server);
  88. printf("server exited, press <enter> key\n");
  89. getchar();
  90. return 0;
  91. }