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!