C# Pourquoi ne pas “Vider” force les octets vers le bas le flux réseau?

J'ai un projet où je suis en train d'envoyer un objet sérialisé pour le serveur, puis d'attendre pour un "OK" ou "ERREUR" message de revenir.

Je semble avoir un problème similaire à l'affiche de : TcpClient envoyer/fermer problème

Le problème est que la seule façon qui me semblent être en mesure d'envoyer l'objet d'origine est de fermer la connexion, mais alors, évidemment, je ne peux pas attendre pour voir si l'objet a été traité avec succès par le serveur.

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()
}

Mise à JOUR: En réponse à un commentaire, je ne pense pas que le client peut être en faute. Il est tout simplement en attente pour l'objet, et l'objet ne vient jamais jusqu'à ce que je ferme la socket.... cependant, si je me trompe, je serai heureux de manger crow publiquement. =) Voici le client:

    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.
        }
    }

Ouais.... c'est aussi simple que cela.

1. Est ProcessPacket appelé? 2. Toute exception levée dans votre ProcessSocket (au moins écrire l'exception d'un journal ou de la console. ne mangez pas seulement). 3. Quelle est la réponse envoyée?
Le ProcessPacket ligne n'est jamais atteint. J'ai un point d'arrêt.
avez-vous essayé d'utiliser C.GetStream().Read() à la place? Avez-vous essayé de vous connecter à l'exception que vous avez ne obtenir? Lire sur les flux orienté vs message oriented protocoles de transmission et vous allez voir pourquoi.
A) je ne suis pas une exception. Je ne suis pas d'obtenir quoi que ce soit. B) Comment est C. GetStream().Read() différent de ce que je suis en train de faire? C) j'ai cassé c'est à cause de ça éléments de base (Lire(byteBuffer), Écrire(byteBuffer), WriteLine(byteBuffer)...) en vain.
Avez-vous essayé de faire une capture WireShark pour voir exactement quand les octets envoyés sur le réseau (ce qui nécessiterait exécutant le client sur une machine et le serveur sur un autre)? Il se peut que les données sont physiquement envoyé, mais que le cours d'eau récepteur est mise en mémoire tampon des données et de ne pas le relâcher jusqu'à ce que la connexion est interrompue par l'auteur.

OriginalL'auteur Jerry | 2011-02-15