static void del_client (struct client *cli) { cli->socket = -1; LOCK (cli->events_mtx); event_queue_free (&cli->events); tags_cache_clear_queue (tags_cache, client_index(cli)); UNLOCK (cli->events_mtx); }
/* Generate a unique playlist serial number. */ static int gen_serial (const struct client *cli) { static int seed = 0; int serial; /* Each client must always get a different serial number, so we use * also the client index to generate it. It must also not be used by * our playlist to not confuse clients. * There can be 256 different serial number per client, but it's * enough since clients use only two playlists. */ do { serial = (seed << 8) | client_index(cli); seed = (seed + 1) & 0xFF; } while (serial == audio_plist_get_serial()); debug ("Generated serial %d for client with fd %d", serial, cli->socket); return serial; }
void ServerLink::ReceiveInitialMessage() { while (IsActive()) { auto packet = Packet::Receive(*socket_tcp_); if (packet.type() == Packet::Type::kInitialMessage) { auto init_message = InitialMessage(packet); handle_received_.InitialMessageData(init_message); server_slot_ = init_message.client_index(); if (server_slot_ >= init_message.max_clients()) { handle_received_.ErrorMessage("Server is full."); Error::LogToFile("Server is full."); Disconnect(); } return; } else if (packet.type() == Packet::Type::kSocketDisconnect) { Disconnect(); return; } } Error::LogToFile("initial message recieved."); }