Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Solid Water

#201
Hola no estoy seguro que sea esto pero podrías probar.
Cuando le haces un close socket cliente, luego sigues enviandole cosas, deberìas poner un return si fallo 3 veces:

Código: c++

void login(int socket_cliente, char user[9], char pass[8]){
        int intentos = 0;
        bzero(user, 9);
        bzero(pass, 8);

         if(intentos == 3){
                close(socket_cliente);
                return;
        }

        send(socket_cliente,"Usuario: ",10,0);
        read(socket_cliente,user,9);
        send(socket_cliente, "Contrasena: ", 12, 0);
        read(socket_cliente, pass, 8);


Y lo mismo luego, al salir de la función aunque el login haya fallado sigues usando socket_cliente, deberías hacer que en lugar de retornar void, login retorne un int o un bool, que si se conecta bien devuelva 1 y si no 0, entonces si devuelve 0 no utilizas más socket_cliente ya que lo cerraste, si no te sale ahora en un rato vengo y te ayudo a modificarlo.

Saludos,
#202
Hola mira yo creo que todo esto viene por que intentas crear un sistema anti fuerza bruta.

La idea sería que cuando un usuario hace un log-in fallido guardes en una base de datos (mysql va bien con ubuntu) el ip la fecha y hora.
Luego cada vez que quiere conectarse haces un select a ese ip para contar todos los intentos fallidos en un intervalo de tiempo, es decir si por ejemplo hizo 10 en una hora no lo dejas conectarse por 12 horas.

El problema que tiene esto es que si se conectan desde la misma red por ejemplo wifi o un cibercafe todos tienen la misma ip pública por lo que confundes 2 usuarios con 1 solo, pero no está del todo mal para comenzar.

Con que los reconozcas por ID quiero hacer énfasis a que por ejemplo en el server cuando llegan o salen mensajes tengas una lista de clientes   list[i_ClientID]->Enviar_Datos(); entonces tu los reconoces por el ID y no caes en la trampa de reconocerlos por ip ya que puede haber 2 clientes con el mismo ip y le mandas mensajes al cliente equivocado.
Supongo que de algún modo ya estas reconociéndolos.

Con respecto al error que te tira, no estoy demasiado ducho en el tema, pero si compartes el código es posible que alguien pueda ayudarte.

Saludos,
#203
Puedes reconocer al cliente por un ID que es lo más indicado ya que 2 clientes pueden tener el mismo IP, entonces cuentas sus conexiones fallidas y cierras la conexión del socket con close.

Así puedas identificar el cliente por un ID, sería bueno que tengas en cuenta lo del IP por si más adelante sientes necesidad de bannear ips.

Más adelante en un sistema más avanzado podrías pedir que se te brinde el hwid o algo similar para banear por hardware id.

Saludos,
#204
Probá así (pone esto antes de la llamada a la función):

Código: vb.net

Dim ms = new MemoryStream()
foto.Save(ms, System.Drawing.Imaging.ImageFormat.Png) ' Use appropriate format here
Dim bytes = ms.ToArray()


y como tercer parámetro le pasas la variable bytes que es ahora tu array de bytes, seguro después cuando haces el select de la base de datos tenes que hacer el camino inverso, pasarlo de array de bytes a image.

Olvide decir que no recuerdo como es el tema de las referencias en VB, en C# para usar stream tenes que hacer un using No tienes permitido ver enlaces. Registrate o Entra a tu cuenta, como no se como es en VB, si no te funciona la línea del MemoryStream ponelo así:

System.IO.MemoryStream

Saludos,
#205
Si vas a la definición de FotoTableAdapter.insert cómo es la definición (o las definiciones)?

Lo digo para que veamos que parámetros está pidiendo la función.
Al parecer no esta esperando un tipo image como tercer parámetro.
Puede ser que el tipo image lo tengas que convertir a array de bytes o algo similar.

Edit me parece que debes convertirlo a byte de arrays, esto que hago en C# deberías hacerlo en No tienes permitido ver enlaces. Registrate o Entra a tu cuenta

Código: csharp

byte[] byteArray = imageToByteArray(image);

  public byte[] imageToByteArray(System.Drawing.Image imageIn)
        {
            MemoryStream ms = new MemoryStream();
            imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
            return ms.ToArray();
        }


Saludos,
#206
Cerrar programa winforms tras 15 minutos de inactividad por parte del usuario.
No parece tan difícil pero veamos como después se complica un poco.
Supongamos que tenemos un formulario padre con 2 botones que llama a los formularios hijos:



Código: csharp

   private void button1_Click(object sender, EventArgs e)
        {
            Form form2 = new Form2();
            form2.Show();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            Form form3 = new Form3();
            form3.Show();
        }




Bueno para controlar los 15 minutos utilizaremos un timmer que agregaremos al formulario 1 y setearemos que cada 1 minuto suba 1 punto el contador al llegar a 15 minutos sin actividad cerraríamos el programa.

En el form1 load declaramos que el timmer llamara a la función TimerEventProcessor cada 1 minuto:
Código: csharp

            timer1.Interval = 60000;
            timer1.Tick += new EventHandler(TimerEventProcessor);
            timer1.Start();


Y en la función nuestro contador aumentará de 1 en 1 y si llega a 15 cerrará el programa:

Código: csharp

private void TimerEventProcessor(object sender, EventArgs e)
        {
            _counter++;
           
            if (_counter == 15)
            {
               
                Environment.Exit(1);
                this.Close();
            }
        }


Cabe destacar que la variable counter es un static int declarado como dato miembro de form1.

Código: csharp

static int _counter;


Bueno todo muy lindo, pero ahora faltaría que cada vez que se presione una tecla o se haga click en algun control de cualquiera de los formularios la variable counter vuelva a 0 así vuelven a contarse los 15 minutos desde la última vez que hubo actividad del usuario.

Para eso debemos delegar a los controles la función que vuelve el contador a 0.

Código: csharp

public static void mdiPrincipal_Click(object sender, EventArgs e)
{
            _counter = 0;
            MessageBox.Show("Click or keypressed");
}


Como estamos testeando le puse a la función un messagebox que me avisa que hubo un click o key pressed.
Pero todavía nos falta delegarle dicha función, a los eventos click y keypress de todos los controles de los formularios.
Sin lugar a dudas hacerlo 1 por 1 sería una solución horrible.
Para delegar la función a los eventos keypressed y click podemos usar un código como el siguiente:

Código: csharp

foreach (Control control in Controls)
{

control.Click += new System.EventHandler(mdiPrincipal_Click);
        control.KeyDown += new KeyEventHandler(mdiPrincipal_Click);
}


Pero el código tiene un problema, cuando el control con el que se encuentra el foreach es un groupBox, este tiene
anidado los controles dentro de el, por lo que se saltiaría todos los controles dentro de groupboxs.
Para solucionarlo podemos decir que si es un group box, recorra los elementos que hay dentro de este último 1 por 1 como lo hace con los de los formularios. El siguiente código funcionaría en caso de que haya como máximo 2 group box (anidados) o cualquier cantidad sin anidar en el formulario:

Código: csharp

foreach (Control control in Controls)
            {
                if (control is GroupBox)
                {
                    foreach (Control controlinside in control.Controls)
                    {
                        if (controlinside is GroupBox)
                        {
                            foreach (Control controlinside2 in controlinside.Controls)
                            {
                                controlinside2.Click += new System.EventHandler(mdiPrincipal_Click);
                                controlinside2.KeyDown += new KeyEventHandler(mdiPrincipal_Click);
                            }
                        }
                        else
                        {

                            controlinside.Click += new System.EventHandler(mdiPrincipal.mdiPrincipal_Click);
                            controlinside.KeyDown += new KeyEventHandler(mdiPrincipal.mdiPrincipal_Click);
                        }
                    }
                }
                else
                {

                    control.Click += new System.EventHandler(mdiPrincipal.mdiPrincipal_Click);
                    control.KeyDown += new KeyEventHandler(mdiPrincipal.mdiPrincipal_Click);
                }
            }


Pero que pasaría si hubiera más de 2 group box no podemos hardcodear todo así. Debemos hacerlo de un modo más prolijo.
Para eso creé una función que utiliza recursividad con los group box volviendo a llamarse una y otra vez siempre y cuando encuentre otro group box anidado.
En conclusión creé 2 funciones la principal (AddEvents) que "si es un group box llama a la recursiva" y si no agrega los eventos a cada control, y la recursiva que se encarga de los group box y group box anidados en otros group box.

Código: csharp

public static void AddEvents(Form form){
             
            foreach (Control control in form.Controls)
            {
               
                if(recursiva(control)){

                }
                else
                {

                    control.Click += new System.EventHandler(mdiPrincipal_Click);
                    control.KeyDown += new KeyEventHandler(mdiPrincipal_Click);
                }
            }
       }


        public static bool recursiva(Control control){

             if (control is GroupBox)
             { 
                   foreach (Control controlinside in control.Controls)
                   {
                       if (recursiva(controlinside))
                        {


                         }else{

                           controlinside.Click += new System.EventHandler(mdiPrincipal_Click);
                           controlinside.KeyDown += new KeyEventHandler(mdiPrincipal_Click);
                        }
                   }

                  return true;

              }else{

                return false;

          }

        }


Por último, nos queda en todos los form loads, llamar a:
Código: csharp

AddEvents(this);


Como podrán ver para testearlo en un formulario anidé muchos groupbox con controles dentro:



Más tarde les dejo el proyecto para descargar que ahora no estoy en casa.

Autor: Solid Water (Matías).

PD: Seguramente podría hacerse de algún modo con hooking o capturar algún evento más, pero bueno todo depende de para que queramos usarlo, podría ser mejor o peor.

Saludos,
#207
YA LO ENCONTRÉ GRACIAS ERA [ code= csharp] saludos y disculpen.


quería saber si existe una etiqueta como [ code = C#] para colocar códigos C# en el foro.
Ya que al hacerlo de ese modo me sale código C.

Código: C#
código en C#
using


Gracias y saludos,
#208
Probá instalar el Visual C++ Redistributable. Es requerido por muchas aplicaciones.

No tienes permitido ver enlaces. Registrate o Entra a tu cuenta

Del mismo modo si la aplicación fue creada en visual basic 6.0 seguramente requiera del common controls y el service pack 6.0

No tienes permitido ver enlaces. Registrate o Entra a tu cuenta

No tienes permitido ver enlaces. Registrate o Entra a tu cuenta

Saludos,
#209
Te quería recomendar que pongas los códigos entre etiquetas [ code = php ]  [ / code] pero sin los espacios, entonces los usuarios podrán copiar y pegar.
Ahora no estoy en casa pero cuando llegue si tengo el código disponible al menos podría probarlo.

Así se ve el código entre las etiquetas:

Código: php
<?php
        //Enter your code here, enjoy!

$array = array("1" => "PHP code tester Sandbox Online", 
              "foo" => "bar", 5 , 5 => 89009,
              "case" => "Random Stuff: " . rand(100,999),
              "PHP Version" => phpversion()
              );
             
foreach( $array as $key => $value ){
    echo $key."\t=>\t".$value."\n";
}?>


Podrías probar hacer un

mail("[email protected]", "testeando asunto", "testeando cuerpo");

Entonces si no funciona el problema es la función o algo relacionado con la misma (Pueden ser los requermientos y configuraciones).
Y si funciona, es por que un dato de los que llega, no le está gustando.

Es decir probalo así hardcodeado y sin el headers.

Acá podes leer sobre los requerimientos y configuraciones necesarias para hacer uso de dicha función:

No tienes permitido ver enlaces. Registrate o Entra a tu cuenta

Saludos y suerte con tu code,
#210
Dudas y pedidos generales / Re:Conexiones a BBDD
Octubre 02, 2018, 02:19:33 PM
Podrías hacer que la conexión de la base de datos, los inserts, selects y demás los haga un web service que corre en el servidor, y desde un cliente llamar a las funciones del web service y enviarle los parámetros.
Entonces los datos de conexion a la DB ya están salvados.

Faltaría proteger las funciones del web service para que no las pueda utilizar cualquiera, para eso podrías hacer que cada usuario haga log-in con un usuario y password, entonces no habría dichos datos en el código.

Con respecto a los selects y demás recomendaría usar parameter.add para evitar inyecciones SQL.

PD: Si necesitas un manual de web service, tengo uno bien explicado en C#, avisame y te lo envío por MP.

Saludos,
#211
Presentaciones y cumpleaños / Re:Hola a TODOS !!
Septiembre 15, 2018, 12:20:54 AM
muy amable, GRACIAS.

Saludos,
#212
hola, es cierto que debes ser más descriptivo.
Por otro lado te dejo un link de abrir puertos desde la consola
No tienes permitido ver enlaces. Registrate o Entra a tu cuenta espero que te sirva.

También te dejo uno de Automatización de la actualización de la IP con script para no-ip No tienes permitido ver enlaces. Registrate o Entra a tu cuenta

Saludos.
#213
Hola resulta que tengo unas imagenes que tienen el siguiente formato, son sprites por lo que tienen un color de fondo y 7 veces un personaje (son de un video juego). el caso es que el personaje tiene dibujado un contorno en un color horrible y salpicaduras del mismo color del contorno.

Entonces lo que yo quiero hacer es invertir el color del contorno y las salpicaduras por el del fondo asi esos colores se vuelven invisibles, me entienden? (Son exactamente del mismo color las salpicaduras y el contorno solo hay que invertir un color por el del fondo).

Hasta ahí entiendo que es posible, pero mi pregunta es ya que las imagenes son 37, será posible hacer eso con las 37 imagenes al mismo tiempo?

No lo creo pero alguien que tenga instaladas las herramientas lo haría por mi si le envío en un .rar las 37 imagenes?

Muchas gracias no importa si no lo hacen, al menos quiero saber si es posible hacerlo con todas al mismo tiempo.

GRACIAS Y SALUDOS !!
#214
Presentaciones y cumpleaños / Hola a TODOS !!
Septiembre 14, 2018, 08:05:26 PM
Hola, soy Solid Water, vine principalmente a comunicarme con seth por mensaje privado ya que el foro donde lo conocí esta caido, pero todavía no se loguió parece.

Pero en este transcurso estuve pensando por que no hacer alguna pregunta, algún aporte, y justo se me vino una duda que la postearé pronto ;)!

Gracias por su atención y saludos a todos !!