elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Tutorial básico de Quickjs


  Mostrar Temas
Páginas: 1 2 3 [4] 5 6 7 8 9 10 11 12 13 14 15 16 17 18
31  Programación / Desarrollo Web / Como crear un formulario de comentarios para tu web en: 13 Diciembre 2019, 05:09 am
Funte: Como crear un formulario de comentarios para tu web

Pues nada lo primero es tener el Formulario en HTML.
Posterior mente el javascript para validar el formulario antes de enviarlo
El script en el Backend para volver a validar los datos.
El metodo de almacenamiento del comentario (Base de datos)
Un sistema para evitar que saturen de comentarios basura
Y al final pero mas importante EVITAR SER HACKEADO (xss, sql, file inclusion etc etc etc etc etc)

El codigo en HTML para el formulario utilizando Boostrap:
Código
  1. <h4>Deja un comentario</h4>
  2. <p></small>Tu dirección de correo electrónico no será publicada. <b>Los campos obligatorios están marcados con *</b></small></p>
  3. <div class="form-group">
  4. <label for="exampleInputUsername">Nombre *</label>
  5. <input type="text" class="form-control" id="exampleInputUsername" aria-describedby="usernameHelp">
  6. <small id="usernameHelp" class="form-text text-muted">Nombre para mostrar, este campo si va a ser mostrado</small>
  7. </div>
  8. <div class="form-group">
  9. <label for="exampleInputEmail">Correo Electronico *</label>
  10. <input type="email" class="form-control" id="exampleInputEmail1" aria-describedby="emailHelp">
  11. <small id="emailHelp" class="form-text text-muted">Tu direccion de correo electronico no sera publicada</small>
  12. </div>
  13. <div class="form-group">
  14. <label for="exampleInputWEB">WEB *</label>
  15. <input type="text" class="form-control" id="exampleInputWEB" aria-describedby="webHelp">
  16. <small id="webHelp" class="form-text text-muted">Direccion WEB Segura valida ejemplo: https://www.example.com/</small>
  17. </div>
  18. <div class="form-group">
  19. <label for="exampleTextAreaComentario">Comentario *</label>
  20. <textarea class="form-control" id="exampleTextAreaComentario" rows="5" aria-describedby="comentarioHelp"></textarea>
  21. <small id="comentarioHelp" class="form-text text-muted">Todos los comentarios seran moderados antes de ser publicados</small>
  22. </div>
  23. <div class="form-group form-check">
  24. <input type="checkbox" class="form-check-input" id="exampleCheckboxSubscribe">
  25. <label class="form-check-label" for="exampleCheckboxSubscribe">Recibir notificaciones de Respuestas a tus comentarios</label>
  26. </div>
  27. <button type="button" class="btn btn-primary">Publicar Comentario</button>
  28. <button type="button" class="btn btn-secondary">Vista Previa</button>
  29. <div id="comentario_vista_previa">
  30. </div>
  31.  
  32.  


Resultado:


32  Programación / Desarrollo Web / Utilizar reCAPTCHA v3 para evitar intentos de fuerza bruta en: 11 Diciembre 2019, 02:04 am
Fuente Utilizar reCAPTCHA v3 para evitar intentos de fuerza bruta

En el Post que acabo de publicar básicamente se muestra el código en javascript y en PHP para implementar el reCAPTCHA v3 en un Formulario para evitar ataques de fuerza bruta.

Codigo en PHP:

Código
  1. <?php
  2. try {
  3.  //Validar datos POST or GET aqui.
  4.  $post_data = http_build_query(
  5.    array(
  6.        'secret' => "SECRET KEY HERE THIS VALUE MUST BE PRIVATE...",
  7.        'response' => $_POST['reCAPTCHA_Token'],//Token devuelto por Google al Front End y enviado a este formulario
  8.        'remoteip' => $_SERVER['REMOTE_ADDR'] //Direccion IP publica del cliente que envia el formulario
  9.    )
  10.  );
  11.  $opts = array('http' =>
  12.    array(
  13.    'method'  => 'POST',
  14.    'header'  => 'Content-type: application/x-www-form-urlencoded',
  15.    'content' => $post_data
  16.    )
  17.  );
  18.  $context  = stream_context_create($opts);
  19.  $response = file_get_contents('https://www.google.com/recaptcha/api/siteverify', false, $context);
  20.  $result = json_decode($response);
  21.  if($result->action != $_POST["action"]) {
  22.    throw new Exception("Google recaptcha action missmatch");
  23.  }
  24.  if($result->score < 0.5) {
  25.    throw new Exception("Google recaptcha score too low");
  26.  }
  27.  //Devuelta a las validaciones actuales de seguridad para los datos recibidos
  28. }catch(Exception $e) {
  29.  //catch exception here
  30. }
  31. ?>

saludos!
33  Programación / Desarrollo Web / (Solucionado) Problema con data de Ajax en: 8 Diciembre 2018, 18:04 pm
Hola que tal espero y me puedan ayudar, tengo un error de lo mas tonto. Sin embargo no se por que el jquery no esta enviando el data mediante Ajax.

JS
Código
  1. function local_search() {
  2. $.ajax({
  3. async: true,
  4. type: "GET",
  5. accepts: "application/json",
  6. url: "/api/search",
  7. data: { s: $("#input_str").value },
  8. success: function (result) {
  9. alert(result.ok);
  10. }
  11. });
  12. }
  13.  

HTML:
Código
  1. <div>
  2. <input id="input_str" type="text">
  3. <button onclick="local_search();">Buscar</button>
  4. </div>
  5.  

Puedo ver que si hace la peticion al servidor, pero no envia nunca la data

RAW Request
Código:
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:63.0) Gecko/20100101 Firefox/63.0
Accept: undefined
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://localhost/
X-Requested-With: XMLHttpRequest
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache



Solución

Codigo Incorrecto
Código:
data: { s: $("#input_str").value },

Codigo Correcto

Código:
[code] data: { s: $("#input_str").val() },
[/code]
34  Foros Generales / Noticias / Hackean Quora? en: 4 Diciembre 2018, 03:05 am
Dear ......

We are writing to let you know that we recently discovered that some user data was compromised as a result of unauthorized access to our systems by a malicious third party. We are very sorry for any concern or inconvenience this may cause. We are working rapidly to investigate the situation further and take the appropriate steps to prevent such incidents in the future.

What Happened

On Friday we discovered that some user data was compromised by a third party who gained unauthorized access to our systems. We're still investigating the precise causes and in addition to the work being conducted by our internal security teams, we have retained a leading digital forensics and security firm to assist us. We have also notified law enforcement officials.

While the investigation is still ongoing, we have already taken steps to contain the incident, and our efforts to protect our users and prevent this type of incident from happening in the future are our top priority as a company.

What information was involved

The following information of yours may have been compromised:

    Account and user information, e.g. name, email, IP, user ID, encrypted password, user account settings, personalization data

    Public actions and content including drafts, e.g. questions, answers, comments, blog posts, upvotes

    Data imported from linked networks when authorized by you, e.g. contacts, demographic information, interests, access tokens (now invalidated)

Questions and answers that were written anonymously are not affected by this breach as we do not store the identities of people who post anonymous content.

What we are doing

While our investigation continues, we're taking additional steps to improve our security:

    We’re in the process of notifying users whose data has been compromised.
    Out of an abundance of caution, we are logging out all Quora users who may have been affected, and, if they use a password as their authentication method, we are invalidating their passwords.
    We believe we’ve identified the root cause and taken steps to address the issue, although our investigation is ongoing and we’ll continue to make security improvements.

We will continue to work both internally and with our outside experts to gain a full understanding of what happened and take any further action as needed.

What you can do

We’ve included more detailed information about more specific questions you may have in our help center, which you can find here.

While the passwords were encrypted (hashed with a salt that varies for each user), it is generally a best practice not to reuse the same password across multiple services, and we recommend that people change their passwords if they are doing so.

Conclusion

It is our responsibility to make sure things like this don’t happen, and we failed to meet that responsibility. We recognize that in order to maintain user trust, we need to work very hard to make sure this does not happen again. There’s little hope of sharing and growing the world’s knowledge if those doing so cannot feel safe and secure, and cannot trust that their information will remain private. We are continuing to work very hard to remedy the situation, and we hope over time to prove that we are worthy of your trust.

The Quora Team
35  Programación / Programación C/C++ / Error con send de Winsock (Solucionado) en: 1 Diciembre 2018, 23:21 pm
Muy buen dia.

Estoy trabajando con un servidor http de lo mas básico posible.

Tengo un error al momento de enviar el contenido. El navegador a veces recibe los archivos incompletos y no logro ubicar el error.



El navegador indica que solo recibe 768KB para el penultimo archivo "/test.mp3"

La salida del programa indica lo siguiente para ese archivo.



Leido indica la cantidad de bytes que a leido desde el archivo:

Código
  1. fseek(contenido,offset,SEEK_SET);
  2. leido = fread(buffer,1,size,contenido);
  3. printf("Leido %i %s\n",leido,path);
  4. if(leido != size) {
  5. fprintf(stderr,"fread() read %i vs request %i\n",leido,size);
  6. exit(0);
  7. }
  8. fclose(contenido);
  9.  

leido toma la cantidad que devuelve fread, si leido y size son distintos el programa termina inmediatamente.


Posteriormente mando ese buffer leido al comando send.

Código
  1. int send_all(SOCKET descriptor, const void *buffer, size_t length, int flags) {
  2. printf("send_all\n");
  3.    ssize_t n;
  4.    const char *p = buffer;
  5.    while (length > 0)
  6.    {
  7.        n = send(descriptor, p, length, flags);
  8. printf("send: %i bytes\n",n);
  9.        if (n <= 0)
  10.            return -1;
  11.        p += n;
  12.        length -= n;
  13.    }
  14.    return 0;
  15. }
  16.  

send all indica mediante la variable "n" la cantidad de datos enviados por send.

Asi mismo en los headers recibe correctamente el mismo numero indicado por el programa:



Asi que dado que la cantidad de items leidos por fread es la misma que la cantidad de bytes enviados por send, no entiendo por que el navegador no recibe todo el archivo, ya que al momento de tratar de reproducirlo esta incompleto.

Saludos



Al final quedo solucionado modificando la funcion send all. Por alguna razon dice que a enviado todos lo 2 MB pero el navegador  solo recibio los 700 KB. Modique la funcion para que envie de 64 bytes por vez y ahora envio el documento completo

Código
  1. int send_all(SOCKET descriptor, const void *buffer, int length, int flags) {
  2. int n,s;
  3. const char *p = buffer;
  4. while (length > 0) {
  5. s = ( length > 64 ) ? 64: length;
  6. n = send(descriptor, p, s, flags);
  7. if (n <= 0)
  8. return -1;
  9. p += n;
  10. length -= n;
  11. }
  12. return 0;
  13. }



Y el programa marca exactamente la misma cantidad.


Saludos!
36  Programación / Programación C/C++ / Primero en Entrar, primero en salir FIFO, Cola o Fila en: 30 Noviembre 2018, 18:38 pm
No es lo mas eficiente, hay muchas cosas se podrian mejorar, en especifico la forma en la que se organizan  el arreglo de elementos actuales en la Fila,  sin embargo funciono para el proposito.

Yo se que la mayoría de estas estructuras ya están implementadas. Pero no se puede decir que eres programador si no sabes implementarlas por tu cuenta.



Código
  1. /*
  2.  El tipo de dato se puede cambiar dependiendo de la implementación que se le quiera dar, también se tendrían que cambiar los tipos de datos devueltos por las funciones
  3.  En este caso yo quería un arreglo de apuntadores char* por lo cual el contenedor es char**
  4.  */
  5.  
  6.  
  7. typedef struct str_queue {
  8. char **queue;
  9. int len;
  10. int max;
  11. }Queue;
  12.  
  13. Queue *create_queue() {
  14. Queue *r = malloc(sizeof(struct str_queue));
  15. r->len = 0;
  16. r->max = 2;
  17. r->queue = malloc(sizeof(char*)*r->max);
  18. return r;
  19. }
  20.  
  21. void free_queue(Queue *q) {
  22. if(q) {
  23. if(q->queue)
  24. free(q->queue);
  25. free(q);
  26. }
  27. }
  28.  
  29. void en_queue(Queue *q, char *ptr) {
  30. if((q->len+1) == q->max) {
  31. q->max *= 2;
  32. q->queue = realloc(q->queue,q->max*sizeof(char*));
  33. }
  34. if(q->queue != NULL) {
  35. q->queue[q->len] = ptr;
  36. q->len++;
  37. }
  38. }
  39.  
  40. char * de_queue(Queue *q) {
  41. char *r = NULL;
  42. int i = 0;
  43. if(q->len >= 1) {
  44. r = q->queue[0];
  45. q->len--;
  46. while(i < q->len) {
  47. q->queue[i] = q->queue[i+1];
  48. i++;
  49. }
  50. q->queue[i] = NULL;
  51. }
  52. return r;
  53. }

Yo en su momento lo utilize para un post, donde realizaba una versión iterativa y necesitaba almacenar en una Cola el listado de los directorios que aun faltaba por recorrer:

problema de memoria con readdir (Solucionado)

Ejemplo de uso:

Código
  1. int main() {
  2. char *cadenas[10] = { "Cadena_0","Cadena_1","Cadena_2","Cadena_3","Cadena_4","Cadena_5","Cadena_6","Cadena_7","Cadena_8","Cadena_9"};
  3. char *actual;
  4. int index1,index2,i =0;
  5. srand(time(NULL));
  6. Queue *q = create_queue();
  7. while(i < 10) {
  8. index1 = rand() % 10;
  9. index2 = rand() % 10;
  10. printf("Agregando a la fila: %s\n",cadenas[index1]);
  11. en_queue(q,cadenas[index1]);
  12. printf("Agregando a la fila: %s\n",cadenas[index2]);
  13. en_queue(q,cadenas[index2]);
  14. printf("Saliendo de la fila %s\n",de_queue(q));
  15. i++;
  16. }
  17. free_queue(q);
  18. }
  19.  

Como es randon la salida es variada, pero podemos observar el funcionamiento:



Código:
Agregando a la fila: Cadena_5
Agregando a la fila: Cadena_5
Saliendo de la fila Cadena_5
Agregando a la fila: Cadena_8
Agregando a la fila: Cadena_2
Saliendo de la fila Cadena_5
Agregando a la fila: Cadena_5
Agregando a la fila: Cadena_7
Saliendo de la fila Cadena_8
Agregando a la fila: Cadena_8
Agregando a la fila: Cadena_7
Saliendo de la fila Cadena_2
Agregando a la fila: Cadena_9
Agregando a la fila: Cadena_2
Saliendo de la fila Cadena_5
Agregando a la fila: Cadena_1
Agregando a la fila: Cadena_3
Saliendo de la fila Cadena_7
Agregando a la fila: Cadena_8
Agregando a la fila: Cadena_5
Saliendo de la fila Cadena_8
Agregando a la fila: Cadena_0
Agregando a la fila: Cadena_3
Saliendo de la fila Cadena_7
Agregando a la fila: Cadena_4
Agregando a la fila: Cadena_0
Saliendo de la fila Cadena_9
Agregando a la fila: Cadena_7
Agregando a la fila: Cadena_1
Saliendo de la fila Cadena_2



Funcion actualizada de de_queue

Código
  1. char * de_queue(Queue *q) {
  2. char *r = NULL;
  3. int i = 0;
  4. if(q->len >= 1) {
  5. r = q->queue[0];
  6. q->len--;
  7. while(i < q->len) {
  8. q->queue[i] = q->queue[i+1];
  9. i++;
  10. }
  11. q->queue[i] = NULL;
  12. }
  13. return r;
  14. }
  15.  
37  Programación / Programación C/C++ / problema de memoria con readdir (Solucionado) en: 29 Noviembre 2018, 18:47 pm
Muy buen dia.

Problema: La memoria utilizada por el programa aumenta y no disminuye

Solución: No es un problema, es la memoria que se genera por el paradigma de la recursividad, esto es: que al llamar a la misma función de forma recursiva, el Stack Frame de la memoria que utiliza cada una de las llamadas a la función se acumule.

Intente aplicar una solucion de forma Iterativa, guardando el Path de los directorios que faltan por leer en una Queue, pero utiliza mas memoria  que la solucion recursiva.

readdir devuelve un apuntador de la estructura (struct dirent)
Mas info: https://linux.die.net/man/3/readdir

El cual creo que es el causante de este POST.

Versión Corta

¿Quien controla el Apuntador entregado por readdir?

Es memoria estatica y no se debe de liberar

Código
  1. directorio_archivo_temporal = readdir(directorio)

Al momento de tratar de liberar dicho apuntador, el programa se cuelga...

Código
  1. while(directorio_archivo_temporal = readdir(directorio) ) {
  2. //etc..
  3. free(directorio_archivo_temporal);
  4. }
  5.  

El problema radica en que la memoria del programa solo aumenta y no disminuye.

Codigo de la version corta funcionando
Código
  1. #include<sys/stat.h>
  2. #include<sys/types.h>
  3. #include<dirent.h>
  4. #include<stdio.h>
  5. #include<stdlib.h>
  6. #include<string.h>
  7.  
  8. int is_regular_file(const char *path);
  9.  
  10. int procesar_directorio(char *path);
  11.  
  12. int main(int argc,char **argv) {
  13. switch(argc){
  14. case 2: //Se espera directorio
  15. procesar_directorio(argv[1]);
  16. break;
  17. default:
  18. printf("Numero de argumentos no esperado\n");
  19. break;
  20. }
  21.  
  22. }
  23.  
  24. int is_regular_file(const char *path) {
  25. struct stat path_stat;
  26. stat(path, &path_stat);
  27. return S_ISREG(path_stat.st_mode);
  28. }
  29.  
  30. int procesar_directorio(char *path) {
  31. DIR *directorio;
  32. struct dirent *directorio_archivo_temporal;
  33. char *path_copy;
  34. int len_path;
  35. char *path_temporal;
  36. int len_path_temporal;
  37. directorio = opendir(path);
  38. if(directorio != NULL) {
  39. len_path = strlen(path);
  40. path_copy = malloc(len_path+2);
  41. memcpy(path_copy,path,len_path);
  42. if(path_copy[len_path - 1] == '\\' ){
  43. path_copy[len_path] = '\0';
  44. }
  45. else {
  46. path_copy[len_path] = '\\';
  47. path_copy[len_path+1] = '\0';
  48. len_path++;
  49. }
  50. while(directorio_archivo_temporal = readdir(directorio) ) {
  51. len_path_temporal = strlen(directorio_archivo_temporal->d_name);
  52. path_temporal = malloc(len_path+len_path_temporal+1);
  53. path_temporal[len_path+len_path_temporal] = '\0';
  54. sprintf(path_temporal,"%s%s",path_copy,directorio_archivo_temporal->d_name);
  55. if(is_regular_file(path_temporal)) {
  56. printf("%s\n",path_temporal);
  57. }
  58. else { //Directorio?
  59. if( len_path_temporal > 2 ) { //not .. or .
  60. procesar_directorio(path_temporal); //recursivamente
  61. }
  62. }
  63. free(path_temporal);
  64. }
  65. free(path_copy);
  66. closedir(directorio);
  67. }
  68. }
  69.  








Versión extensa

Aquí esta toda la Letanía

Estoy realizando un programa que lea de forma Recursiva un directorio dado y liste los archivos en pantalla. Nada del otro mundo. Asi mismo estoy haciendo que el formato de salida sea el formato tipo UNIX /bla/bla/bla en lugar del formato de windows C:\lalala\lalalala.txt

Esto con el objetivo de virtualizar el path de subdirectorios específicos para otro programa pero eso ya es harina de otro costal.

El problema es que cuando listo Cualquier carpeta con muchos subdirectorios como la unidad C:\  el programa en empieza usando lo clasico unos 400 KB y termina utilizando 800 KB o mas dependiendo de la carpeta que este listada.

El dia Ayer publique un post parecido:
Problema de memoria en miniservidor usando Winsock (Solucionado)

En el cual se estaba cerrando el socket de forma incorrecta.

En este caso creo que es problema del apuntador devuelto por readdir.

Código del programa funcionando:

Código
  1. #include<sys/stat.h>
  2. #include<sys/types.h>
  3. #include<dirent.h>
  4. #include<stdio.h>
  5. #include<stdlib.h>
  6. #include<string.h>
  7.  
  8. int fsize(const char *filename);
  9. int is_regular_file(const char *path);
  10.  
  11. int procesar_directorio(char *path,char *virtual_path);
  12.  
  13. int main(int argc,char **argv) {
  14. switch(argc){
  15. case 2: //Se espera directorio
  16. procesar_directorio(argv[1],"/");
  17. break;
  18. case 3: //Se espera archivo + nombre de directorio de destino.
  19. break;
  20. default:
  21. printf("Numero de argumentos no esperado\n");
  22. break;
  23. }
  24.  
  25. }
  26.  
  27. int is_regular_file(const char *path) {
  28. struct stat path_stat;
  29. stat(path, &path_stat);
  30. return S_ISREG(path_stat.st_mode);
  31. }
  32.  
  33. int fsize(const char *filename) {
  34.    struct stat st;
  35.    if (stat(filename, &st) == 0)
  36.        return st.st_size;
  37.    return -1;
  38. }
  39.  
  40. int procesar_directorio(char *path,char *virtual_path) {
  41. DIR *directorio;
  42. struct dirent *directorio_archivo_temporal,*result;
  43.  
  44. char *path_copy;
  45. char *virtual_path_copy;
  46. int len_path,len_virtual_path;
  47.  
  48. char *path_temporal;
  49. char *virtual_path_temporal;
  50. int len_path_temporal;
  51. int len_virtual_path_temporal;
  52.  
  53.  
  54. directorio = opendir(path);
  55. if(directorio != NULL) {
  56.  
  57. len_path = strlen(path);
  58. len_virtual_path = strlen(virtual_path);
  59.  
  60. virtual_path_copy = malloc(len_virtual_path+2);
  61. path_copy = malloc(len_path+2);
  62. memcpy(path_copy,path,len_path);
  63. memcpy(virtual_path_copy,virtual_path,len_virtual_path);
  64.  
  65. if(path_copy[len_path - 1] == '\\' ){
  66. path_copy[len_path] = '\0';
  67. }
  68. else {
  69. path_copy[len_path] = '\\';
  70. path_copy[len_path+1] = '\0';
  71. len_path++;
  72. }
  73. if(virtual_path_copy[len_virtual_path - 1] == '/' ){
  74. virtual_path_copy[len_virtual_path] = '\0';
  75. }
  76. else {
  77. virtual_path_copy[len_virtual_path] = '/';
  78. virtual_path_copy[len_virtual_path+1] = '\0';
  79. len_virtual_path++;
  80. }
  81. /*
  82. directorio_archivo_temporal = calloc(1,sizeof(struct dirent));
  83. result == NULL;
  84. */
  85. //while(readdir_r(directorio,directorio_archivo_temporal,&result) == 0 && result != NULL){
  86. while(directorio_archivo_temporal = readdir(directorio) ) {
  87.  
  88. len_path_temporal = strlen(directorio_archivo_temporal->d_name);
  89. //printf("readdir point to %p\n",directorio_archivo_temporal);
  90. //printf("Len %i : %s\n",len_path_temporal,directorio_archivo_temporal->d_name);
  91.  
  92. path_temporal = malloc(len_path+len_path_temporal+1);
  93. virtual_path_temporal = malloc(len_virtual_path + len_path_temporal+1);
  94.  
  95. path_temporal[len_path+len_path_temporal] = '\0';
  96. virtual_path_temporal[len_virtual_path+len_path_temporal] = '\0';
  97.  
  98. sprintf(path_temporal,"%s%s",path_copy,directorio_archivo_temporal->d_name);
  99. sprintf(virtual_path_temporal,"%s%s",virtual_path_copy,directorio_archivo_temporal->d_name);
  100.  
  101. if(is_regular_file(path_temporal)) {
  102. //printf("Archivo :\"%s\"\n",path_temporal);
  103. printf("%s\n",virtual_path_temporal);
  104. }
  105. else { //Directorio?
  106. if( len_path_temporal > 2 ) { //not .. or .
  107. procesar_directorio(path_temporal,virtual_path_temporal); //recursivamente
  108. }
  109. }
  110. free(path_temporal);
  111. free(virtual_path_temporal);
  112. }
  113. //free(directorio_archivo_temporal);
  114.  
  115.  
  116.  
  117. free(path_copy);
  118. free(virtual_path_copy);
  119. closedir(directorio);
  120. }
  121. else {
  122. printf("El directorio \"%s\" no es un directorio valido\n",path);
  123. }
  124. }
  125.  

Funciona bien, recibe parametros de entrada, ejemplo

Ejemplo

Código:
C:\>generar_contenido.exe contenido
/index.html

Le agregue un getchar al final del archivo para poder ver con cuanta memoria termina el programa. Para carpetas sin tanto subdirecorio no hay problema, el detalle es cuando se trata de todo un disco...

Imagen:


Ya he validado que todos los apuntadores que yo genero de forma dinámica son liberados en su totalidad, esto mediante re implementaciones de malloc,calloc,realloc y free como describo en el siguiente post: ¿He liberado todos los apuntadores?

Imagen:


Con lo cual considero que el problema es el apuntador devuelto por readdir.

Intente cambiar el siguiente pedazo de codigo

Código
  1. while(directorio_archivo_temporal = readdir(directorio) ) {
  2. //etc...
  3. }
  4.  

por

Código
  1. while(directorio_archivo_temporal = readdir(directorio) ) {
  2. //etc..
  3. free(directorio_archivo_temporal);
  4. }
  5.  

Pero el programa se queda colgado por un rato y finaliza, seguramente por tratar de escribir en memoria que no esta asignada...

Intente implementarlo con readdir_r utilizando mi propio apuntador previamente asignado..

Código
  1. while(readdir_r(directorio,directorio_archivo_temporal,&result) == 0 && result != NULL){
  2.  

Pero por alguna razon MinGW no lo tiene implementado, y segun he visto ya esta deprecated, entonces ¿Cual puede ser la solución?

Saludos!



Pordon por el Post tan largo, aqui esta su patata

38  Programación / Programación C/C++ / Problema de memoria en miniservidor usando Winsock (Solucionado) en: 28 Noviembre 2018, 23:13 pm
Estoy haciendo pruebas con un miniservidor, que actualmente solo lee la entrada y la muestra en pantalla.



El detalle esta en que La memoria utilizada no deja de incrementar, empieza el programa usando sobre 400 KB y mientras mas preciono F5 en el navegardor WEB, (El miniservidor es WEB), enviando Multiples GET al servidor la memoria del programa incrementa y nunca decrementa, siendo que en cada ocasion he liberado el apuntador utilizado para leer la linea, y he cerrado el socket del cliente:

Codigo:

Código
  1. #include<winsock2.h>
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include <unistd.h>
  5.  
  6. #define BACKLOG 256
  7.  
  8. WSADATA *wsaData;
  9. struct sockaddr_in *server_sa;
  10.  
  11. char *readLine(SOCKET descriptor,int *len);
  12.  
  13. int main() {
  14. SOCKET s,c;
  15. int b = 0,iResult;
  16. int read_len;
  17. char *linea;
  18. char caracter;
  19. wsaData = calloc(1,sizeof(WSADATA));
  20. iResult = WSAStartup(MAKEWORD(2,2), wsaData);
  21. if (iResult != 0) {
  22. printf("WSAStartup failed: %d\n", iResult);
  23. return 1;
  24. }
  25. if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
  26. perror("socket");
  27. return 2;
  28. }
  29. server_sa = calloc(1,sizeof(struct sockaddr_in));
  30. server_sa->sin_family = AF_INET;
  31. server_sa->sin_port   = htons(80);
  32. server_sa->sin_addr.s_addr = htonl(INADDR_ANY);
  33.  
  34. if (bind(s,(struct sockaddr *) server_sa, sizeof(struct sockaddr)) < 0) {
  35. perror("bind");
  36. return 3;
  37. }
  38. b = sizeof(struct sockaddr);
  39. listen(s, BACKLOG);
  40. while(1) {
  41. if((c = accept(s,(struct sockaddr *)server_sa, &b)) < 0) {
  42. printf("WS error code: %i\n",WSAGetLastError());
  43. perror("accept");
  44. return 4;
  45. }
  46. do{
  47. linea = readLine(c,&read_len);
  48. printf("%s\n",linea);
  49. free(linea);
  50. }while(read_len != 0);
  51. close(c);
  52. }
  53. }
  54.  
  55. char *readLine(SOCKET descriptor,int *len) {
  56. char *buffer = NULL;
  57. int i = 0,entrar = 1,len_read;
  58. do {
  59. buffer = realloc(buffer,(i+1));
  60. len_read = recv(descriptor,buffer + i,1,0);
  61. if(len_read == 1){
  62. switch(buffer[i]) {
  63. case 0xD:
  64. buffer[i] = '\0';
  65. break;
  66. case 0xA:
  67. buffer[i] = '\0';
  68. entrar = 0;
  69. break;
  70. default:
  71. i++;
  72. break;
  73. }
  74. }
  75. else {
  76. buffer[i] = '\0';
  77. entrar = 0;
  78. }
  79. }while(entrar);
  80. if(len  != NULL){
  81. len[0] = i;
  82. }
  83. return buffer;
  84. }
  85.  

El problema es que se espera que el servidor se lo mas liguero ligero posible y atienda millones de peticiones por segundo. Y no creo que el F5 del navegador supere mas de 100 peticiones por segundo.

Saludos
39  Programación / Programación C/C++ / socket siempre me devuelve -1 (Solucionado) en: 27 Noviembre 2018, 03:57 am
Hola a todos anteriormente ya habia trabajado con sockets en C, sin embargo no estoy seguro si es mi Computadora actual la del problema:

Código
  1. #include<winsock2.h>
  2. #include<stdio.h>
  3.  
  4. int main() {
  5. int s;
  6. if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
  7. printf("Valor %i\n",s);
  8. perror("socket");
  9.        return 1;
  10. }
  11. }
  12.  

En mi caso al compilar y ejecutar el codigo anterior siempre me devuelve menos -1

Código:
C:\> gcc -o test.exe test.c -lws2_32
C:\> test.exe
Valor -1
socket: No error

El codigo original es mas extenso, pero incluso con ese fragmento basico de codigo me devulve error...

Version de gcc
Código:
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=c:/mingw/bin/../libexec/gcc/mingw32/6.3.0/lto-wrapper.exe
Target: mingw32
Configured with: ../src/gcc-6.3.0/configure --build=x86_64-pc-linux-gnu --host=mingw32 --target=mingw32 --with-gmp=/mingw --with-mpfr --with-mpc=/mingw --with-isl=/mingw --prefix=/mingw --disable-win32-registry --with-arch=i586 --with-tune=generic --enable-languages=c,c++,objc,obj-c++,fortran,ada --with-pkgversion='MinGW.org GCC-6.3.0-1' --enable-static --enable-shared --enable-threads --with-dwarf2 --disable-sjlj-exceptions --enable-version-specific-runtime-libs --with-libiconv-prefix=/mingw --with-libintl-prefix=/mingw --enable-libstdcxx-debug --enable-libgomp --disable-libvtv --enable-nls
Thread model: win32
gcc version 6.3.0 (MinGW.org GCC-6.3.0-1)

Voy a tratar de actualizar el mingw

Saludos
40  Programación / Programación C/C++ / Archivar directorio completo en un solo archivo. en: 25 Noviembre 2018, 07:06 am
Realice un programa que pueda recibir parámetros desde la linea de comandos, dicho programa recibirá un directorio en el disco duro o un archivo

Si es Directorio..
  • Comprobar que el directorio sea valido.
  • Comprobar que sea distinto al directorio actual.
  • Listar los archivos y pesos en bytes en el directorio mencionado.
  • Realizar una copia de seguridad de dichos archivos, con las siguientes características
  • Todos lo archivos del directorio se deben de guardar en un unico archivo llamado directorio.dir donde directorio se debe sustituir por el nombre  del directo indicado en primer lugar. Ejemplo "C:\temp\codigos\" el archivo se debe de llamar codigos.dir
  • Se debera de tener un registro  también en archivo (index.dat), que contenga Nombre, donde comienza y cuando espacio ocupa cada archivo del directorio en el nuevo.
  • Se debera realizar también una validación tipo checkum de cada archivo, utilice el sistema Hash de su preferencia para hacer esta validación.


Si es archivo, deberá de ser alguno en terminación .dir
  • Comprobar que exista
  • Que este completo segun la lista de archivos que previamente guardamos en el index.dat
  • Debera de Extraerlo en un directorio indicado por el usuario (En un segundo parametro al programa) distinto al directorio Original.

El programa podrá ser creado en C o C++

Deberá de utilizar en cualquier momento la menor cantidad de memoria posible y ser lo bastante rápido para pode competir con otros.

El post es solo para darle un poco mas de movimiento a este subforo de programación en C/C++.

Si tienen dudas sobre una parte en especifico, pueden de preferencia abrir un nuevo tema, con la duda en especifico.

Si alguno quiere participar comentelo aqui, asi mismo también pueden sugerir mas features para el programa. Ya que opciones hay varias.

La intención no es reinventar la rueda, programas similares ya existen Tipo (TAR), la intención es que quien este aprendiendo C o C++ pueda retarse asi mismo con algo que en un futuro pueda reutilizar. Y no se diga la experiencia.

Saludos
Páginas: 1 2 3 [4] 5 6 7 8 9 10 11 12 13 14 15 16 17 18
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines