Nice. Very Unix-ish in its spirit.
The client-server arrangement is backwards though :) Typical arrangement is for the clients to do the "anyone there?" broadcast, for the servers to reply and then the client would select the server, connect to it and they would go about their business. In your case, the server connects to the client. If you re-arrange this to natural client-server order, you should be able to get rid of the fork() call and this will help with portability (not that you probably care at this point).
Also,
size = fread(&buf, 1, 100, ft)
No harm in using chunks larger than 100, especially when dispensing larger files.Also, consider switching to multicast for discovery.