Good thinking! I would definitely start with 1:1.
Then: vis, forking for each client, that is one possibility if you want to make the connection persist. Every time you accept() a client, that client gets a new socket. However, you probably don't really need a persistant connection if the exchange is something like client logs on, client asks for file, server sends file, done. In that case, you can simply wait with accept() in a loop that answers and deals with every incoming call, and disconnects when the request is complete -- this is how an internet server works, more or less. Altho apache does fork, it does not fork for every request*, and it does not maintain open connections -- every request opens a new socket, then closes it when the request is complete. This method will work for an "unlimited" number of clients, but they get served one at a time. I do not know if a forking model -- where in theory, near simultaneous requests will be dealt with in parallel -- is faster than one which goes thru them one at a time. Either way, with <30 clients asking for (small) text files there unlikely to be any relevant delays at all by the server.
If possible tho, check with your prof to make sure he is not expecting a forking model.
*it does use a thread for each request, which is almost the same thing, but the premise is still that the threads do not persist. I do not think threading or forking is necessary at this scale. Of course, you may as well learn both methods. Which one you use now is up to you, I don't know the details of the requirements.