int server_receive_packets() { static size_t num_packets_received = 0; static size_t num_bytes_received = 0; static _timer timer2; time_t t = timer2.get_ns(); if (t > 1000000000) { std::cerr << "packets received per second: " << num_packets_received << " (" << num_bytes_received << " B/s).\n"; timer2.begin(); num_packets_received = 0; num_bytes_received = 0; } struct sockaddr_in from; socklen_t from_length = sizeof(from); // the UDP socket is now int non-blocking mode, i.e. recvfrom returns 0 if no packets are to be read // memset(packet_data, 0, maximum_packet_size); *** memset(&from, 0, from_length); int received_bytes = recvfrom(sockfd, (char*)packet_data, maximum_packet_size, 0, (struct sockaddr*)&from, &from_length); packet_data[received_bytes] = '\0'; num_bytes_received += received_bytes < 0 ? 0 : received_bytes; size_t num_packets = 0; if (received_bytes <= 0) { return 1; } // else: num_packets_received++; do { ++num_packets; num_bytes_received += received_bytes < 0 ? 0 : received_bytes; ; server_process_packet(&from); memset(&from, 0, from_length); received_bytes = recvfrom(sockfd, (char*)packet_data, maximum_packet_size, 0, (struct sockaddr*)&from, &from_length); packet_data[received_bytes] = '\0'; } while (received_bytes > 0); return 0; }
int main (int argc, char ** argv) { prev = getthetime(); (void) signal(SIGINT,leave); if (enet_initialize () != 0) { fprintf (stderr, "An error occurred while initializing ENet.\n"); return EXIT_FAILURE; } atexit (enet_deinitialize); address.host = ENET_HOST_ANY; address.port = 5001; enetserver = enet_host_create (& address /* the address to bind the server host to */, 32 /* allow up to 32 clients and/or outgoing connections */, 0 /* allow up to 2 channels to be used, 0 and 1 */, 0 /* assume any amount of incoming bandwidth */, 0 /* assume any amount of outgoing bandwidth */); if (enetserver== NULL) { fprintf (stderr, "An error occurred while trying to create an ENet server host.\n"); exit (EXIT_FAILURE); } tronserver = server_init(enetserver); atexit(clean_up); printf("This is the TronClone Server.\nPush ^c to kill the server.\n"); /* Main game loop */ while(1) { int i, index, temp; char buf[80]; if (enet_host_service (enetserver, & event, 10) > 0) { switch (event.type) { case ENET_EVENT_TYPE_CONNECT: enet_address_get_host_ip(&event.peer->address, buf, sizeof buf); printf ("A new client connected from %s\n", buf); server_add_user(tronserver, event.peer); break; case ENET_EVENT_TYPE_RECEIVE: server_process_packet(tronserver, event); enet_packet_destroy (event.packet); break; case ENET_EVENT_TYPE_DISCONNECT: enet_address_get_host_ip(&event.peer->address, buf, sizeof buf); printf ("A client disconnected from %s: %u.\n", buf, event.peer -> address.port); server_remove_user(tronserver, event.peer); event.peer -> data = NULL; break; } } now = getthetime(); double h = (now-prev)/1000000.0f; server_update(tronserver, h); prev = now; } clean_up(); }