[C#]Problema con Sockets + Formularios

Iniciado por Jubjub, 3 Enero 2008, 22:57 PM

0 Miembros y 1 Visitante están viendo este tema.

Jubjub

Estoy haciendo una aplicacion con Sockets (basada en el Tutorial de Sockets de Hendriҳ), pero con la diferencia de que yo lo he intentado hacer con formularios, y he tenido dos problemas.

1.-Al darle al boton de escuchar, el programa se cuelga. Le envio mensajes por el Netcat y no responde, pero al enviarle el comando EXIT, que cierra la conexion interrumpiendo el bucle do, el programa se "descuelga" y puedo ver todo lo que le he enviado, la pregunta es si se puede conseguir hacerlo de otra forma para que no se cuelgue.   :( (Con consola va perfeco)

2.-El texto que aparece en el textbox "llegada" aparece demasiado seguido, le he añadido un TAB porque no se cual es la forma de indicar un salto de linea.
  :-(

Aquí esta el código:

Código (csharp) [Seleccionar]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;

namespace Hola_Netcat_
{

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {


        }

        private void button1_Click(object sender, EventArgs e)
        {

                       IPAddress direc = Dns.GetHostEntry("localhost").AddressList[0];
            IPEndPoint Ep = new IPEndPoint(direc, 1235);
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            socket.Bind(Ep);
            socket.Listen(100);
            Socket handler = socket.Accept();

            byte[] bytes = new byte[1024]; //Declaramos un array de bytes de longitud 1024
            int count;
            String data = ""; //Declaramos data, que sera donde se guarde lo que recibamos
            string limp = ""; //Declaramos limp, donde se almacenara data sin salto de linea
            int longi ; //Declaramos longi, donde se almacenara la longitud de data

            do //Bucle Do/While
            {
                count = handler.Receive(bytes); //Recibimos los datos enviados y lo guardamos en cout.
                data = System.Text.Encoding.ASCII.GetString(bytes, 0, count); //Lo codificamos a cadena (ya que se envian como bytes)
                if (data != "salir\n") //Mientras lo recibido no sea exit + intro
                {
                    longi = data.Length - 1;
                    limp = data.Remove(longi, 1);

                    llegada.Text = llegada.Text + "Informacion recibida:" + limp + "  "; //Mostramos lo recibido con el textbox "llegada"
                }
               
               
            } while (data != "exit\n");  //Mientras lo recibido no sea exit + Intro se continua el bucle, si recibimos exit + intro, salimos del bucle

            llegada.Text =  llegada.Text + "Se ha finalizado la conexión"; //Avisamos qde que se a terminado la transferencia de datos

            byte[] msg = System.Text.Encoding.ASCII.GetBytes("\n\nFinalizada conexion con la aplicacion"); //Codificamos de string a byte

            handler.Send(msg); //Enviamos el mensage al cliente
            handler.Shutdown(SocketShutdown.Both); //"Apagamos" los sockets
            handler.Close(); //Los cerramos

        }

        private void timer1_Tick(object sender, EventArgs e)
        {

        }
}

       
                           
               
       

        }
   



Muchas gracias al que me ayude.  ;)
Jugando con Fósforoshacking con un tono diferente


.
porno

MANULOMM

hola, antes de todo, quiero aclarar que no he visto todo el code y poco he trabajado con  sockets en .net pero creo que deberias de programarte un delegado para cuando el socket reciva los datos algo asi como recive o algo fijate en la documentacion o en las propiedades del socket a ver que eventos te encuentras.... en todo caso intenta reemplazar el do while por otra cosa, muy aconsejable un evento...

Atentamente,

Juan Manuel Lombana
Medellìn - Colombia


angelveredis

Tal vez ya sea un poco tarde pero este problema le puede surgir a mas de una persona.
Bueno lo que tendrias que usar aqui seria un hilo y para esto debes usar el espacio de nombres System.Threading los hilos permiten ejecutar tareas paralelas para seguir normalmente el funcionamiento del programa sin esperar la terminacion de otra bueno estos son los pasas para hacerlo.

1.-Agregar el espacio de nombres asi Using System.Threading.
2.-Crear un metodo void donde se hace la conexion y donde se pretende escuchar al cliente.
Private void conexionconhilo()
  {
         IPAddress direc = Dns.GetHostEntry("localhost").AddressList[0];     
         IPEndPoint Ep = new IPEndPoint(direc, 1235);     
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Bind(Ep);       
socket.Listen(100);   
Socket handler = socket.Accept();
//abajo siguen las demas lineas...
  }


3.-Ahora declaramos un artibuto de la clase Threading.

Private Threading hiloaux;

4.-Por ultimo en el boton donde quieran hacer la conexion on el load del programa procederemos a utilzar el hilo hilo axiliar.

ThreadStart hiloxd = new ThreadStart(conexionconhilo);
            hiloaux = new Thread(hiloxd);
            hiloaux.Start();


Bueno creo que eso es todo  si desearan obtener el nombre del servidor de forma que no sepan cual es el nombre cree este metodo espero y les sirva en algo.

1.-Agregamos el espacio de nombres using Microsoft.Win32.

2.-Creamos un metodo el cual nos devolvera el nombre del servidor o del equipo.

Private string nombredelequipo()
  {
    string x =""
RegistryKey reg = Registry.LocalMachine.OpenSubKey (@"SOFTWARE\Microsoft\Windows NT\CurrentVersion", true);
reg1.OpenSubKey("RegisteredOwner",true);
x= reg.GetValue("RegisteredOwner").ToString();//Obtenemos el nombre del equpo y se lo asignamos a x.
return x;
}


3.- Ahora agregamos el metodo:
IPAddress direc = Dns.GetHostEntry(nombredelequipo()).AddressList[0];

Bueno eso fue mi pequeño aporte espero que a alguin le sea util. :D



Jubjub

Cuantisimo tiempo hace de aquello! :D

No sabia ni que era el \n :P

Si lo hubiera tenido que hacer hoy en dia, probaria primero con un DoEvents por ahi, aunque thread seria bastante mas adecuado :P
Jugando con Fósforoshacking con un tono diferente


.
porno

vanad

Hola, yo tengo un problema similar.
En lugar de ejecutar el thread desde un boton lo hago en la funcion form_load ya que necesito que este activo desde el principio, el problema es que mientras el hilo esta en ejecución la función que lo ha lanzado no finaliza y mientras no finaliza el form_load no se puede usar el formulario.

Agradeceria mucho si alguien supiera como solucionar este problemilla. 


[D4N93R]