Scusa ma dovresti riguardarti decisamente lo studio delle variabili puntatore.
Ci sono vari errori, a partire dal "salva" già segnalato da oregon, passando per la write
dove dovevi usare:
write(sc, buffer, len);
e non
write(sc, &buffer, len);
oppure per &msg->type, che non so cosa sia type, ma se era una array, visto che usi strlen, era ovviamente "msg->type" senza "&"

P.S. Riguardo alla strncat, ottimo usarla, però fai attenzione se la stai usando (1) perché la tua stringa non è null-terminated o (2) perché non vuoi sforare la lunghezza del buffer. In quest'ultimo caso quel msg->length è lo spazio disponibile rimanente? Non mi pare che nelle righe precedenti sia stato calcolato...