2018/9/16 COMP1521 18s2 – Week 09 Lab Exercise
https://cgi.cse.unsw.edu.au/~cs1521/18s2/labs/week09/index.php 1/3
COMP1521 18s2 Week 09 Lab Exercise
A Minimal Web Server
Computer System
Fundamentals
Objectives
to learn about HTTP
to practice working with sockets
Admin
Grades A+=outstanding, A=very good, B=adequate, C=sub-standard, D=hopeless
Demo in the Week09 Lab or at the start of the Week03 Lab
Submit give cs1521 lab09 server.c or via WebCMS
Deadline must be submitted by 11:59pm Sunday 23 September
Note: you need to do something truly outstanding, above and beyond the “call of duty” to get A+. Doing the exercise well and
correctly as specified will get you an A grade. An A grade gets you full marks; an A+ grade gives a small bonus.
Background
Setting Up
Make a new directory for this lab, change into that directory, and run the command:
$ unzip /home/cs1521/web/18s2/labs/week09/lab09.zip
To work on this at home, download the ZIP file and unzip it on your own machine. You should be able to
get a web server working on most implementations of Unix. It works on Linux and MacOS, at least, but
no guarantees about other systems.
The unzip command will place the following files in you directory
Makefile a set of dependencies used to control compilation
server.c a small skeleton program for the warm-up exercise
The main task for this lab is to build a minimal web server that can run on your local machine (e.g. a
CSE workstation) and can interact with a web server running on the same machine.
You should read the code in theserver.c file to work out what needs to be done (look for TODO). You
might recognise much of the code in the main() function from one of the examples in the Week08
Lectures. See if you can remember what all of the parameters and data types were for the various
socket functions; or at least recall the general method for setting up a socket on a server: create a
socket, bind it to an address (host+port), start it listening, accept connections.
You can use the Makefile to compile the server (and it will give compile errors until you fix it). When it’s
executable, you run the server in one terminal window and send requests to it either from another
terminal window (using the curl command) or from a web browser running on the same machine as the
server. You can use the output appearing in the terminal where the server is running for debugging.
An example of running the server, and the kind of output you might see:
$ ./webserver
WebServer: waiting for connections…
… the server will wait here …
https://www.cse.unsw.edu.au/~cs1521/18s2/index.php
https://www.cse.unsw.edu.au/~cs1521/18s2/index.php
https://www.cse.unsw.edu.au/~cs1521/18s2/labs/week09/lab09.zip
2018/9/16 COMP1521 18s2 – Week 09 Lab Exercise
https://cgi.cse.unsw.edu.au/~cs1521/18s2/labs/week09/index.php 2/3
… until it receives a request …
… at which point it will display …
WebServer: got connection
Request: GET /hello HTTP/1.1
… after processing the request …
… the server will wait here …
… until it receives a another request …
… etc. etc. etc. …
Note: if you leave your webserver running and someone else comes to use the workstation, or even if
you try to run it again, you will receive the error message:
$ ./webserver
WebServer: binding socket: Address already in use
and your server won’t start. If it’s your webserver that’s causing this, simply kill it. If some other
inconsiderate person has left their server running, you can try to get around this by using a different port
number. You will need to change it in the code, then recompile, and then use different URLs to the ones
below (using the new port number).
Exercise
The server.c files contains a partially complete implementation of a web server. The server runs on the
local host and writes logging/debugging information on its standard output. You need to complete it so
that it can respond to the following HTTP requests:
Request Response
http://localhost:3490/ Server running …
http://localhost:3490/hello Hello
http://localhost:3490/hello?John Hello, John!
http://localhost:3490/date Sat Sep 15 16:35:44 2018
http://localhost:3490/xyz 404 Page Not Found
Obviously, we don’t always want the same date as above. You need to extract the current date/time and
render that as a character string. The library functions time() and ctime() will help; read the man
entries to find out how they work.
Similarly, we don’t always want the name John. The server should return an appropriate response
whatever name is supplied. You can use the sscanf() function to extract the name, or do it some other
way if you wish.
Note that if you test the server using curl, you will see the logging and debugging information
intermingled with the HTTP response on your terminal. If you send requests through a web browser, you
will see the responses (once your server is working) in the browser’s window.
Challenge exercises
2018/9/16 COMP1521 18s2 – Week 09 Lab Exercise
https://cgi.cse.unsw.edu.au/~cs1521/18s2/labs/week09/index.php 3/3
Make the webserver handle other HTTP operations, such as POST and PUT.
Submission
You need to submit one file: server.c. You can submit this via the command line using give or you can
submit it from within WebCMS. After submitting the code, show your tutor, who’ll give you feedback on
your work and award a grade.
Have fun, jas