aboutsummaryrefslogtreecommitdiff

Snowcast

Description

A music streaming server consisting of three programs: the server, the client controller, & the client listener.

Getting Started

Making the executables

  • Ensure you have gcc installed, as that is what the Makefile uses.
  • Run make in your terminal to make the 3 executables ./snowcast_server, ./snowcast_control, & ./snowcast_listener!

Executing program

Running the 3 executables without arguments will tell you the necessary arguments to get going.

  • To run the server, type in ./snowcast_server into your terminal.
  • To run the controller, type ./snowcast_control into your terminal.
  • To run the listener, type ./snowcast_listener into your terminal.

Program Design

I did not implement origonal design doc, due to random malloc errors with the autograder. I rewrote the server, with the the design...

  • A "select_thread" controls accepting new clients and responding to commands from clients. It redirects the logic to separate helper functions to send replies.
  • The station information is held by an array. Each station has a thread that broadcasts to the listeners every half-second (at half the rate per second). At the bottom of this half-second, the station file is read into a buffer and threads are created off of this buffer, waiting to be released. At the top of this half-second, the station thread then bradcasts a cond variable to start all threads that send the station.
  • The users pointer containing the user data (along with the separate stations pointer) has a mutex users_mutex that allows safe-thread write and deletion. This pointer is also dynamic, using realloc when more memory is needed. There are a few memory optimizations implemented (see init_user(...)).
  • The code is well documented, so many smaller design choices can be read there :)

Acknowledgments