Problema de memoria en miniservidor usando Winsock (Solucionado)

Iniciado por AlbertoBSD, 28 Noviembre 2018, 23:13 PM

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

AlbertoBSD

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:


#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;
wsaData = calloc(1,sizeof(WSADATA));
iResult = WSAStartup(MAKEWORD(2,2), wsaData);
if (iResult != 0) {
printf("WSAStartup failed: %d\n", iResult);
return 1;
}
if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("socket");
return 2;
}
server_sa = calloc(1,sizeof(struct sockaddr_in));
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) {
perror("bind");
return 3;
}
b = sizeof(struct sockaddr);
listen(s, BACKLOG);
while(1) {
if((c = accept(s,(struct sockaddr *)server_sa, &b)) < 0) {
printf("WS error code: %i\n",WSAGetLastError());
perror("accept");
return 4;
}
do{
linea = readLine(c,&read_len);
printf("%s\n",linea);
free(linea);
}while(read_len != 0);
close(c);
}
}

char *readLine(SOCKET descriptor,int *len) {
char *buffer = NULL;
int i = 0,entrar = 1,len_read;
do {
buffer = realloc(buffer,(i+1));
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
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

Eternal Idol

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

AlbertoBSD

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!
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

Eternal Idol

De nada; y no, son sockets, no archivos, no hay una interfaz generica en este caso.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón