Per quanto riguarda le socket studiale qui' che e' una guida fatta benissimo
http://www.lilik.it/~mirko/gapil/gapil.html
(la sezione due tratta la programmazione di rete)


Per fare cio' che vuoi inoltre ti consiglio di non usare i files, ma le socket (quindi file descriptor), troverai tutto sui files descriptor nel capitolo 6 della GaPiL...


comunque hai quel problema perche' le funzioni *scanf() si fermano quando trovano uno spazio... Per evitare questo inconveniente potresti cercare di modificare il tipo di bufferizzazione dello stream: guarda qui' http://www.lilik.it/~mirko/gapil/gapilsu111.html
Una volta aperti i files con la funzione fdopen dovresti eseguire sui puntatori in e out la seguente funzione
setvbuf(FILE *stream, char *buf, int mode, size_t size)
in questo modo:

setvbuf (in, char *buf, _IONBF, 0)
setvbuf (out, char *buf, _IONBF, 0)


In questo modo pero' non godrai dei vantaggi offerti dalla lettura bufferizzata... Per sapere quali sono leggiti qui': http://www.lilik.it/~mirko/gapil/gapilch8.html