Ok, ya lo tengo hecho. Al final lo he hecho algo más sencillo y no con tantos Streams como dije xD
Al pasar la longitud como un string me volvia a dar error algunas veces, con que el formato no era adecuado para luego ser convertido a "int".
De modo que lo he pasado como 4 bytes, para un int32
Por si a alguien le sirve dejo aqui como lo he hecho:
Cliente
//Leemos el contenido del fichero
byte[] contenido = File.ReadAllBytes(ruta);
//Obtenemos la longitud en bytes del fichero leido
byte[] longitud = BitConverter.GetBytes(contenido.Length);
//Pasamos la cantidad de bytes del fichero
NWSServer.Write(longitud, 0, longitud.Length);
SWServer.Flush();
//Pasamos el contenido del fichero
NWSServer.Write(contenido, 0, contenido.Length);
NWSServer.Flush();
Servidor
//Leemos la longitud del fichero que estará en un int32bits (4bytes)
byte[] longitud
= new byte[4];
NWSCliente.Read(longitud, 0, longitud.Length);
int size = BitConverter.ToInt32(longitud, 0);
//Reservamos el espacio requerido
byte[] contenido
= new byte[size
];
//Leemos el contenido del fichero
NWSCliente.Read(contenido, 0, size);
//Creamos el fichero
FileStream fs
= new FileStream
(ruta_destino, FileMode
.Create, FileAccess
.Write);
//Escribimos los datos en él
fs.Write(contenido, 0, size);
fs.Close();
Saludos!