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