Si, ok, ma per fare una fork() non ho bisogno dell'accept() che è solo per tcp?
No, non c'entra.
Quello che tipicamente fai è mettere l'accept() all'interno di una fork o di un thread in quanto accept() è bloccante, ma questo vale per qualunque chiamata di questo tipo (bloccante).

Io avevo pensato, non so se è fattibile, di far arrivare tutti i client su di una porta del server (x es.9300) poi rispondere assegnandogli un altra porta (con una funzione random) in modo da avere una porta x ogni client, e far lavorare il server in parallelo.
No, utilizzando UDP "lato server" non hai più una accept() ma una unica recv()/recvfrom() che richiami di continuo la quale ti ritorna i dati ricevuti e l'indirizzo del mittente.
Non so di preciso quale sia il tuo problema e sarà almeno 2 anni che non vedo UDP ma in genere quello che si fa con un server UDP è essenzialmente quello, quindi non credo tu abbia neanche bisogno di utilizzare fork, thread, select e compagnia.

Ti premetto che è solo un mese che utilizzo il C, e gia tirar su un client ed un server non è stato banale, per me, ma lavorando con le virtual machine non mi posso permettere java....
Infatti quello che consiglio sempre è di non utilizzare C nè tanto meno lavorare con socket, fork, thread e select nativamente per fare questo genere di cose.
Un mucchio di lavoro extra che un linguaggio di più alto livello con l'ausilio di un framework di rete ti eviterebbe.