C # ¿Por qué "Flush" no fuerza los bytes hacia abajo en la transmisión de la red?

Tengo un proyecto en el que intento enviar un objeto serializado al servidor, luego espero a que aparezca el mensaje "OK" o "ERROR".

Parece que tengo un problema similar al póster de:TcpClient enviar / cerrar problema

El problema es que la única forma en que parece que puedo enviar el objeto original es cerrar la conexión, pero luego (por supuesto) no puedo esperar para ver si el servidor procesó el objeto con éxito.

private void button4_Click(object sender, EventArgs e)
{
    RequestPacket req = new RequestPacket();

    /// ... Fill out request packet ...

    /// Connect to the SERVER to send the message...
    TcpClient Client = new TcpClient("localhost", 10287);
    using (NetworkStream ns = Client.GetStream())
    {
        XmlSerializer xml = new XmlSerializer(typeof(RequestPacket));
        xml.Serialize(ns, req);

        /// NOTE: This doesn't seem to do anything.... 
        ///       The server doesn't get the object I just serialized.
        ///       However, if I use ns.Close() it does... 
        ///          but then I can't get the response.
        ns.Flush();

        // Get the response. It should be "OK".
        ResponsePacket resp;

        XmlSerializer xml2 = new XmlSerializer(typeof(ResponsePacket));
        resp = (ResponsePacket)xml2.Deserialize(ns);


        /// ... EVALUATE RESPONSE ...
    }

    Client.Close()
}

UPDATE: en respuesta a un comentarista, no creo que el cliente pueda tener la culpa. Simplemente está esperando el objeto, y el objeto nunca llega hasta que cierro el zócalo ... sin embargo, si me equivoco, con mucho gusto comeré cuervo públicamente. =) Aquí está el cliente:

    static void Main(string[] args)
    {
        // Read the port from the command line, use 10287 for default
        CMD cmd = new CMD(args);
        int port = 10287;

        if (cmd.ContainsKey("p")) port = Convert.ToInt32(cmd["p"]);

        TcpListener l = new TcpListener(port);
        l.Start();

        while (true)
        {
            // Wait for a socket connection.
            TcpClient c = l.AcceptTcpClient();

            Thread T = new Thread(ProcessSocket);

            T.Start(c);
        }
    }


    static void ProcessSocket(object c)
    {
        TcpClient C = (TcpClient)c;

        try
        {
            RequestPacket rp;
            //// Handle the request here.
            using (NetworkStream ns = C.GetStream())
            {
                XmlSerializer xml = new XmlSerializer(typeof(RequestPacket));
                rp = (RequestPacket)xml.Deserialize(ns);
            }

            ProcessPacket(rp);
        }
        catch
        {
            // not much to do except ignore it and go on.
        }
    }

Sí ... es así de simple.

Respuestas a la pregunta(4)

Su respuesta a la pregunta