Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: AlbertoBSD en 28 Noviembre 2018, 23:13 pm



Título: Problema de memoria en miniservidor usando Winsock (Solucionado)
Publicado por: AlbertoBSD en 28 Noviembre 2018, 23:13 pm
Estoy haciendo pruebas con un miniservidor, que actualmente solo lee la entrada y la muestra en pantalla.

(http://i.imgur.com/yqKzcMVt.png) (https://imgur.com/yqKzcMV)

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


Título: Re: Problema de memoria en miniservidor usando Winsock
Publicado por: Eternal Idol en 29 Noviembre 2018, 00:12 am
Tenes que usar closesocket y no close.


Título: Re: Problema de memoria en miniservidor usando Winsock
Publicado por: AlbertoBSD en 29 Noviembre 2018, 00:42 am
Excelente con eso ya funciona muy bien  ;-)

Esos de Microsoft ni siquiera dejan utilizar el Descriptor proporcionado por accept como un File Descriptor normal para usarlo con fdopen y/o read y write. En fin es windows  :rolleyes:

Salduos!


Título: Re: Problema de memoria en miniservidor usando Winsock (Solucionado)
Publicado por: Eternal Idol en 29 Noviembre 2018, 10:42 am
De nada; y no, son sockets, no archivos, no hay una interfaz generica en este caso.