Ver Mensaje Individual
  #1 (permalink)  
Antiguo 20/02/2007, 05:49
chcma
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 20 años, 10 meses
Puntos: 7
NetworkStreams C# 2.0

Buenar tardes foreros !!!

Bueno, estoy intentando realizar una escritura y una lectura de forma asíncrona através de NetworkStreams en dos aplicaciones de prueba para ir trasteando un poco. Por ahora me va a "MEDIAS" bien y nunca mejor dicho.

El problema que tengo es que (Como verán en el código) cada vez que pulso el botón enviar, envio un dato nuevo junto con un número que voy aumentando (Esto lo hago para hacer un pequeño seguimiento).

Pues bien... de cada vez que pulso el botón, solo llega uno de dos. Por ejemplo:
Esto es un texto a enviar.1 (Este no llega)
Esto es un texto a enviar.2 (Este si llega)
Esto es un texto a enviar.3 (Este no llega)
Esto es un texto a enviar.4 (Este si llega)

Y no tengo ni idea de por qué es... estuve mirando tanto en el "cliente" como en el "servidor" y en fin.. creo que el problema lo tengo en el servidor, que no termina la lecutra hasta que le vuelvo a enviar un dato... pero no lo tengo claro.


codigo Programa que Envia
Código:
        private Socket objSocket;
        int contadorPrueba = 0;
        private void button1_Click(object sender, EventArgs e)
        {
            IPEndPoint equipoDestino = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 2999);
            objSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            objSocket.Connect(equipoDestino);
        }

        private NetworkStream objStream;
        private void button2_Click(object sender, EventArgs e)
        {
            contadorPrueba++;
            objStream = new NetworkStream(objSocket);
            if (objStream.CanWrite)
            {
                byte[] datoEnviar;
                datoEnviar = ASCIIEncoding.ASCII.GetBytes("Esto es un texto a enviar." + contadorPrueba.ToString());
                objStream.Write(datoEnviar, 0, datoEnviar.Length);
                objStream.Close();
            }
        }



codigo Programa que Recibe
Código:
        private Socket objSocket;
        private void IniciarSocket()
        {
            IPEndPoint equipoLocal = new IPEndPoint(IPAddress.Any, 2999);
            objSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            objSocket.Bind(equipoLocal);
            objSocket.Listen(5);

            objSocket.BeginAccept(new AsyncCallback(ConexionEstablecida), objSocket);
        }
        private void ConexionEstablecida(IAsyncResult Iar)
        {
            //objSocketManejador: Representa al socket de IniciarSocket, es "el mismo objeto".
            Socket objSocketManejador = (Socket)Iar.AsyncState;
            Socket objSocketCliente = objSocketManejador.EndAccept(Iar);

            if (objSocketCliente.Connected)
            {
                NetworkStream objStream = new NetworkStream(objSocketCliente);
                byte[] datosRecibidos = new byte[1024];
                objStream.BeginRead(datosRecibidos, 0, datosRecibidos.Length, new AsyncCallback(DatosRecibidos), objStream);
            }
        }



        private void DatosRecibidos(IAsyncResult Iar)
        {
            NetworkStream objStream = (NetworkStream)Iar.AsyncState;
            int datosLeidos = objStream.EndRead(Iar);
            if (datosLeidos > 0)
            {
                byte[] datosRecibidosAsync = new byte[1024];
                int i = 0;
                while (i <= 0)
                {
                    i = objStream.Read(datosRecibidosAsync, 0, datosRecibidosAsync.Length);
                }
                string cadena = ASCIIEncoding.ASCII.GetString(datosRecibidosAsync);
                listBox1.Items.Add(cadena);
            }

            byte[] datosRecibidos = new byte[1024];
            objStream.BeginRead(datosRecibidos, 0, datosRecibidos.Length, new AsyncCallback(DatosRecibidos), objStream);
        }


Por favor, si alguien tiene tiempo para hecharle un ojo a mi código y dedicarme unos minutos para decirme donde tengo el fallo, le estaría muy agradecido.

Saludos.
__________________
Charlie.