Для сервера я бы взял libevent или Boost asio, но так как по заданию было необходимо использовать POSIX sockets, то я остановился на функции select, для реализации неблокирующих сокетов. Функция server() частично основана на примере для функции select.
Для вычисления SHA-1 нашел открытые исходники (sha1.cpp, sha1.h), чтобы не подключать лишних библиотек.