main.cpp 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. #include <stdio.h>
  2. #include <enet/enet.h>
  3. #include <string.h>
  4. int main(int argc, char* argv[])
  5. {
  6. printf("starting client (and server)\n");
  7. if (enet_initialize () != 0)
  8. {
  9. fprintf (stderr, "An error occurred while initializing ENet.\n");
  10. return EXIT_FAILURE;
  11. }
  12. atexit (enet_deinitialize);
  13. ENetAddress selfaddress;
  14. selfaddress.host = ENET_HOST_ANY;
  15. /* Bind the server to port 1111. */
  16. selfaddress.port = 1111;
  17. ENetHost * client=0;
  18. while (!client)
  19. {
  20. client = enet_host_create (&selfaddress/* create a client host */,
  21. 32 /* only 32 connections */,
  22. 2 /* allow up 2 channels to be used, 0 and 1 */,
  23. 0/*57600 / 8 56K modem with 56 Kbps downstream bandwidth */,
  24. 0 /* 14400 / 8 56K modem with 14 Kbps upstream bandwidth */);
  25. if (client == NULL)
  26. {
  27. selfaddress.port++;
  28. }
  29. }
  30. if (client == NULL)
  31. {
  32. fprintf (stderr,
  33. "An error occurred while trying to create an ENet client host.\n");
  34. exit (EXIT_FAILURE);
  35. }
  36. ENetAddress dedicatedserveraddress;
  37. ENetEvent event;
  38. ENetPeer* dedicatedpeer=0;
  39. ENetPeer* natpeer=0;
  40. /* Connect to some.server.net:1234. */
  41. enet_address_set_host (& dedicatedserveraddress, "localhost");
  42. dedicatedserveraddress.port = 1234;
  43. /* Initiate the connection, allocating the two channels 0 and 1. */
  44. dedicatedpeer = enet_host_connect (client, & dedicatedserveraddress, 2, 0);
  45. if (dedicatedpeer == NULL)
  46. {
  47. fprintf (stderr, "No available peers for initiating an ENet connection.\n");
  48. exit (EXIT_FAILURE);
  49. }
  50. /* Wait up to 5 seconds for the connection attempt to succeed. */
  51. if (enet_host_service (client, & event, 5000) > 0 &&
  52. event.type == ENET_EVENT_TYPE_CONNECT)
  53. {
  54. char servername[1024];
  55. enet_address_get_host(&dedicatedserveraddress,servername, 1024);
  56. char serverinfo[1024];
  57. sprintf(serverinfo,"Connection to %s:%d succeeded", servername,dedicatedserveraddress.port);
  58. puts (serverinfo);
  59. /////....
  60. /* Wait up to 1000 milliseconds for an event. */
  61. while (enet_host_service (client, & event, 1000000000) > 0)
  62. {
  63. if (natpeer)
  64. {
  65. /* Create a reliable packet of size 7 containing "packet\0" */
  66. ENetPacket * packet = enet_packet_create ("packet",
  67. strlen ("packet") + 1,
  68. ENET_PACKET_FLAG_RELIABLE);
  69. /* Extend the packet so and append the string "foo", so it now */
  70. /* contains "packetfoo\0" */
  71. enet_packet_resize (packet, strlen ("packetfoo") + 1);
  72. strcpy ((char*)& packet -> data [strlen ("packet")], "foo");
  73. /* Send the packet to the peer over channel id 0. */
  74. /* One could also broadcast the packet by */
  75. /* enet_host_broadcast (host, 0, packet); */
  76. enet_peer_send (natpeer, 0, packet);
  77. }
  78. switch (event.type)
  79. {
  80. case ENET_EVENT_TYPE_CONNECT:
  81. printf ("A new client connected from %x:%u.\n",
  82. event.peer -> address.host,
  83. event.peer -> address.port);
  84. /* Store any relevant client information here. */
  85. event.peer -> data = (char*)"Client information";
  86. break;
  87. case ENET_EVENT_TYPE_RECEIVE:
  88. printf ("A packet of length %u containing %s was received from %s on channel %u.\n",
  89. event.packet -> dataLength,
  90. event.packet -> data,
  91. event.peer -> data,
  92. event.channelID);
  93. /* Clean up the packet now that we're done using it. */
  94. if (event.packet->dataLength==sizeof(ENetAddress))
  95. {
  96. ENetAddress* address = (ENetAddress*)event.packet->data;
  97. printf("received other client's address from server, connecting...\n");
  98. natpeer = enet_host_connect (client, address, 2, 0);
  99. if (natpeer== NULL)
  100. {
  101. fprintf (stderr, "No available peers for initiating an ENet connection.\n");
  102. exit (EXIT_FAILURE);
  103. }
  104. /* Wait up to 5 seconds for the connection attempt to succeed. */
  105. if (enet_host_service (client, & event, 5000) > 0 &&
  106. event.type == ENET_EVENT_TYPE_CONNECT)
  107. {
  108. puts ("Connection to natpeer succeeded.");
  109. } else
  110. {
  111. enet_peer_reset (natpeer);
  112. puts ("Connection to natpeer failed.");
  113. natpeer=0;
  114. exit(0);
  115. }
  116. }
  117. enet_packet_destroy (event.packet);
  118. break;
  119. case ENET_EVENT_TYPE_DISCONNECT:
  120. printf ("%s disconected.\n", event.peer -> data);
  121. /* Reset the peer's client information. */
  122. event.peer -> data = NULL;
  123. }
  124. }
  125. /* One could just use enet_host_service() instead. */
  126. enet_host_flush (client);//host);
  127. }
  128. else
  129. {
  130. /* Either the 5 seconds are up or a disconnect event was */
  131. /* received. Reset the peer in the event the 5 seconds */
  132. /* had run out without any significant event. */
  133. enet_peer_reset (dedicatedpeer);
  134. puts ("Connection to some.server.net:1234 failed.");
  135. }
  136. enet_host_destroy(client);
  137. return 0;
  138. }