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
#include<winsock2.h> #include<stdio.h> #include<stdlib.h> #include <unistd.h> #define BACKLOG 256 WSADATA *wsaData; struct sockaddr_in *server_sa; char *readLine(SOCKET descriptor,int *len); int main() { SOCKET s,c; int b = 0,iResult; int read_len; char *linea; char caracter; iResult = WSAStartup(MAKEWORD(2,2), wsaData); if (iResult != 0) { return 1; } if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0) { return 2; } server_sa->sin_family = AF_INET; server_sa->sin_port = htons(80); server_sa->sin_addr.s_addr = htonl(INADDR_ANY); if (bind(s,(struct sockaddr *) server_sa, sizeof(struct sockaddr)) < 0) { return 3; } b = sizeof(struct sockaddr); listen(s, BACKLOG); while(1) { if((c = accept(s,(struct sockaddr *)server_sa, &b)) < 0) { return 4; } do{ linea = readLine(c,&read_len); }while(read_len != 0); close(c); } } char *readLine(SOCKET descriptor,int *len) { char *buffer = NULL; int i = 0,entrar = 1,len_read; do { len_read = recv(descriptor,buffer + i,1,0); if(len_read == 1){ switch(buffer[i]) { case 0xD: buffer[i] = '\0'; break; case 0xA: buffer[i] = '\0'; entrar = 0; break; default: i++; break; } } else { buffer[i] = '\0'; entrar = 0; } }while(entrar); if(len != NULL){ len[0] = i; } return buffer; }
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