Problemilla con librería "fsock.dll"

Started by Arcontus, August 18, 2010, 09:22:13 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

FreeYourMind

Es que mi ejemplo ya estaba modificado y por otro lado no lo tengo ya, hice la prueba en el curro  ;D

SplinterGU

pues vale, no siento, por el momento no podre ayudarte, estoy a 1/2 maquina...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

FreeYourMind

No, si no es a mi que me tienes que ayudar, es sólo un reparo de algun posible bug de Bennu, para mi esta ok  ;D
Es tu ejemplo, no me pidas lo que es tuyo

SplinterGU

Quote from: FreeYourMind on January 14, 2012, 11:13:23 AM
No, si no es a mi que me tienes que ayudar, es sólo un reparo de algun posible bug de Bennu, para mi esta ok  ;D
Es tu ejemplo, no me pidas lo que es tuyo

cuando recupere mi disco y mi backup lo vere... gracias.

no has hecho la prueba que te pedi, cierto?
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

FreeYourMind

Que ya no tengo la carpeta de la demo, tendria que montarlo de nuevo con la ultima version.
A ver si luego cuando me ponga con algo lo miro

SplinterGU

hombre, simplemente copias el fuente del post que pusiste aca, lo editas, lo compilas y listo... yo no tengo la fsock.dll que estabas usando, si me la pasas lo pruebo...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

FreeYourMind

La tienes tu en tu pagina de descargas del betatester, no se si me explico xD

SplinterGU

ls fsock? jojo.. que despistado que estoy... gracias!
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

#23
lo dicho, write_var funciona perfectamente en el ejemplo... cuando se conecta el cliente el contador sube, cuando se responde el contador se decrementa y el proceso cliente muere...

lo que habias reportado no tiene logica, pero bueno... en fin...

pone una pagina grande, saca el set_fps(0,0), ponele un set_fps(1,0) y vas a ver como vas a ver al contador mantenerse un tiempito.

EDIT: No se porque en wine no me abre la conexion en el port 80, com le estoy pidiendo... en fin... el write_var y la fsock funcionan.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

FreeYourMind

A mi no me funciona.
Yo cada cliente que habro es una pestaña nueva en el navegador, no se como lo haces tu...

SplinterGU

puf!!!

hombre, que tengas 800 pestañas del navegador ni significan que tengas 800 clientes conectados... las pestañas del navegador, no significan conexiones permanentes (si bien existen servidores que pueden soportar conexiones persistentes, este no es el caso)... incluso cada pestaña para que vos puedas ver la pagina en tu navegador, se ejecutaron muchas conexionex http... muchos requermientos... por ejemplo, 1 requerimiento trae la pagina html, otro requerimiento, traer 1 imagen que referencia el html (1 requermiento por cada imagen)... luego podes tener 1 requermiento por cada .js o cada .flv o cada .swf o cada .css que aparezca en la pagina, por cada objeto que llame la pagina es 1 requerimiento...

los requerimientos se atienden y cuando obtienen su respuesta, se corta la conexion...

por ende, cuando la pagina esta cargada, ya no existe ningun cliente conectado... por 800, 1000 o 3000 pestañas que tengas abiertas...

acaso pensabas que mientras tenias el browser con la pagina mostrandose estabas conectado al servidor?

bue, espero haber explicado un poco el tema...

hay muchos documentos en internet que describen el protocolo http...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

FreeYourMind

Y porque client es incrementado al abrir una pestana nueva con la pagina ? El say asi lo indica

SplinterGU

#27
pero es lo que te estoy diciendo, al conectarse se incrementa y en el onexit se decrementa...

ni te has molestado en ver el codigo, cierto? simplemente como no funcionaba segun tu logica piensa que deberia funcionar, has dicho que no funciona, cierto?

por favor, lee el codigo, y pregunta si no entiendes algo... no tengo problema de explicarlo linea a linea si es necesario, pero intenta entenderlo.

y repito, la cantidad de clientes, no va a asociada a la cantidad de pestañas, sino a la cantidad de pedidos a la vez... cada objeto es 1 pedido, por ejemplo, si tengo un html con 1 grafico... son 2 clientes (que pueden ejecutarse a la vez o no, depende de la rapidez con que se respondan o como el browser los pida), 1 cliente es el html y otro cliente es el grafico... son 2 archivos que se le piden al servidor... el contador de clientes solo esta indicando los clientes que se estan atendiendo (o estan conectados), cuando se les atendio el pedido, se desconectan...

pensa que ningun servidor puede mantener todas las conexiones activas, debe atenderlas lo mas rapido posible y liberar el puerto para otro nuevo cliente... sino ningun servidor web en internet podria subsistir demasiado tiempo... con 65535 pedidos (si nos ponemos optimistas y pensando que son todos los puertos para el, cosa que nunca es cierto) se quedaria sin poder atender a otros.

ademas, es simple, le quitas el clientes--; y veras que el contador incrementa... vamos hombre, al menos molestate en probar lo que te pido... por lo menos asi me haces sentir que no pierdo el tiempo explicando a una planta o una pared...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

FreeYourMind

Si tienes razón, habre metido la pata, pero puse el write en un proceso nuevo despues del client++ (matando el proceso y limpiando el texto antes) y este se incrementaba siempre sin nunca decrementar... Bueno ya miraré porque ocurre esto ultimo. gracias y perdona.

Aqui el código modificado:


global
    clients=0;
    logfd;
    DocumentRoot = "webpages";
    AccessLog = "access.log";
begin
    full_screen=false;
    set_title("Mini WebServer");
    fsock_init( 0 ); // Inicializamos la librería fsock
    //write(0,5,5,0,"Clients: ");
    //write(0,5+text_width(0,"Clients: "),5,0,clients);
write_screen();
    server_thread();
end;
process write_screen()
begin
    write(0,5,5,0,"Clients: ");
    write(0,5+text_width(0,"Clients: "),5,0,clients);
LOOP
frame;
end
end
function log(string slog)
private
    strint str;
begin
    logfd = fopen(AccessLog, O_RDWR);
    if (!logfd)
        logfd = fopen(AccessLog, O_WRITE);
    end
    fseek(logfd, 0, SEEK_END);
    fputs(logfd,ftime("%d/%m/%Y-%H:%M:%S> ",time()) + slog);
    fclose(logfd);
end
process server_thread()
private
    int socket_listen; // socket_listen para recoger peticiones
    int connection=0;
    int ipaddr, portaddr;
    int i;
    int informacion; // enviaremos a los clientes números aleatorios entre 0 y 32768
begin
    log("Web Server, Started!");
    socket_listen=tcpsock_open(); // nuevo socket
    fsock_bind(socket_listen,80); // asociamos socket_listen con el puerto 80
    tcpsock_listen(socket_listen,64); // numero de conexiones a escuchar igual a clients
    fsock_fdzero(0);
    fsock_fdset(0,socket_listen);
    while(!key(_ESC))
        if (fsock_select(0,-1,-1,0)>0)
            connection=tcpsock_accept(socket_listen, &ipaddr, &portaddr);
            if(connection>0)
                process_client(connection, ipaddr, portaddr);
            end
        end
       
        fsock_fdset (0, socket_listen); //hay que reincluir tras uso de select
        frame;
    end;
onexit
    fsock_quit(); // Cerramos la librería fsock
end
process process_client(int sock, int ipaddr, int portaddr)
private
    char msg[2048];
    string hdrFields[128];
    string request[3];
    rlen, slen, n, pos, d1, d2, cnt;
    fp;
    string lang;
begin
    clients++;
delete_text(all_text);
signal(type write_screen, s_kill);
write_screen();

    //log("Connect from ip "+((ipaddr)&0ffh)+"."+((ipaddr>>  &0ffh)+"."+((ipaddr>>16)&0ffh)+"."+((ipaddr>>24)&0ffh));
    log("Connect from ip "+ fsock_get_ipstr(&ipaddr) + ":" + portaddr);
    fsock_fdzero(1);
    fsock_fdset(1,sock);
    while(!key(_esc))
        // Esto se podria hacer todo un fdset general, pero como cada frame se ejecuta por separado no hay problemas aca
        if (fsock_select(1,-1,-1,0)>0 && fsock_fdisset(1,sock))
            // En una aplicacion real, aca se debe poner un loop hasta recibir el paquete completo
            rlen=tcpsock_recv(sock,&msg,sizeof(msg));
            if(rlen<=0)
                break;
            end
            // Suponemos que aca tenemos el paquete completo
            cnt=split("["+chr(13)+chr(10)+"]+", msg, &hdrFields, sizeof(hdrFields));
            for(n=1;n<cnt;n++)
                if(strcasecmp(substr(hdrFields[n],0,17),"Accept-Language: ")==0)
                    lang=substr(hdrFields[n],17);
                end
            end
            cnt=split("[ ]+", hdrFields[0], &request, sizeof(request));
            log("Request ["+hdrFields[0]+"]");
            if(request[0]!="GET")
                msg=request[2]+" 405 Method Not Allowed";
                tcpsock_send(sock,&msg,len(request[2])+23);
                break;
            end
            /* Expand */
            while((pos=find(request[1],"%")) != -1)
                d1=asc(ucase(substr(request[1], pos+1, 1)));
                d2=asc(ucase(substr(request[1], pos+2, 1)));
                if(d1>=asc("A"))
                    d1-=asc("A")-10;
                else
                    d1-=asc("0");
                end
                if(d2>=asc("A"))
                    d2-=asc("A")-10;
                else
                    d2-=asc("0");
                end
                request[1]=substr(request[1], 0, pos)+chr(d1*16+d2)+substr(request[1], pos+3);
            end
            /* Comprueba si se quiere acceder a otro directorio anterior al DocumentRoot */
            if(find(request[1], "..") != -1)
                msg=request[2]+" 403 Forbidden";
                tcpsock_send(sock,&msg,len(request[2])+14);
                break;
            end
            // Aca usando los modo de manejo de archivos GZ, podemos dar soporte a archivos paginas gzip
            if(substr(request[1],-1,1)=="/")
                fp = fopen(DocumentRoot+request[1]+"index.html."+lang, O_READ);
                if (!fp)
                    fp = fopen(DocumentRoot+request[1]+"index.htm."+lang, O_READ);
                end
                fp = fopen(DocumentRoot+request[1]+"index."+lang+".html", O_READ);
                if (!fp)
                    fp = fopen(DocumentRoot+request[1]+"index."+lang+".htm", O_READ);
                end
                if (!fp)
                    fp = fopen(DocumentRoot+request[1]+"index.html", O_READ);
                end
                if (!fp)
                    fp = fopen(DocumentRoot+request[1]+"index.htm", O_READ);
                end
                if (!fp)
                    fp = fopen(DocumentRoot+request[1]+"index.html.html", O_READ);
                end
                if (!fp)
                    fp = fopen(DocumentRoot+request[1]+"index.htm.html", O_READ);
                end
                if (!fp)
                    fp = fopen(DocumentRoot+request[1]+"index.html.htm", O_READ);
                end
                if (!fp)
                    fp = fopen(DocumentRoot+request[1]+"index.htm.htm", O_READ);
                end
            else
                fp = fopen(DocumentRoot+request[1]+"."+lang, O_READ);
                if (!fp)
                    fp = fopen(DocumentRoot+request[1], O_READ);
                end
                if (!fp)
                    fp = fopen(DocumentRoot+request[1]+".html", O_READ);
                end
                if (!fp)
                    fp = fopen(DocumentRoot+request[1]+".htm", O_READ);
                end
            end
            if (!fp)
                msg=request[2]+" 404 Not Found";
                tcpsock_send(sock,&msg,14+len(request[2]));
                break;
            end
            while(!feof(fp))
                slen=fread(fp, msg);
                tcpsock_send(sock,&msg,slen);
                frame;
            end
            fclose(fp);
            break;
        end
       
        fsock_fdset(1,sock); //hay que reincluir socket tras select
        frame;
    end
onexit
    fsock_close(sock);// Cierra el socket
    clients--;
end

SplinterGU

free, write no se actualiza cuando cambia de valor...

en fin...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2