none
Test de velocidad de linea

    Frage

  • Hola,

     

    Estoy hecho un lio, estoy creado un proyecto para medir la velocidad de transferencia entre N maquinas que se encuentran en una red local.

     

    Basicamente lo que hago es un aspx que tiene mas o menos este formato:

     

    1.  script de javascript donde recojo el tiempo actual starttime = new Date();
    2.  form que contiene una etiqueta div con el atributo runat=server
    3.  script de javascript que recoge el tiempo actual endtime = new Date();

     

    Vale por parte del servidor, en el init de la pagina, abro un fichero binario y leo 512KB y lo vuelco en un stringbuilder definido previamente.

     

     

    Bloque de código

    Dim output As StringBuilder = New StringBuilder()

     

    Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init

    If Not Page.IsPostBack Then

    'fs -> stream que abre el fichero

    Dim fs As IO.FileStream = New IO.FileStream(AppDomain.CurrentDomain.BaseDirectory & _

    "fichero.bin", FileMode.Open)

    'r reader que lee el fichero definido en fs

    Dim r As IO.BinaryReader = New IO.BinaryReader(fs)

    Try

    r.BaseStream.Seek(0, SeekOrigin.Begin) 'Situamos el puntero al ppio del archivo

    While r.BaseStream.Position <= 524288 'Leemos 512 KB -> 512 * 1024

    output.Append(r.ReadByte)

    End While

    Finally

    fs.Close() 'Cerramos el stream

    End Try

    End If

    End Sub

     

     

    En el load de la pagina, vuelco el contenido de la variable output que es el stringbuilder en el div

     

    Bloque de código

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    If Not Page.IsPostBack Then 'Primer load

    'Cargo todo lo que he leido del fichero en la pagina, con lo que la pagina pesar  unos 512 KB

    'Lo meto en el DIV que se encuentra justo entre el inicio y el final del cronometro de javascript.

    div.InnerHtml = "<!-- " & output.ToString & " -->"

    Else

    End If

    End Sub

     

     

     

    En el aspx tengo al final otro script para ver los resultados de forma temporal

     

    Bloque de código

    <script type="text/javascript">

    <!--

    if (endtime == starttime)

    {downloadtime = 0

    }

    else

    {downloadtime = (endtime - starttime)/1000; //segundos

    }

    document.getElementById("txtTime").value=downloadtime;

    linespeed = (512* 8)/downloadtime; //kbit/segundo

    document.getElementById("txtLinespeed").value = linespeed;

    kbps = linespeed //kbits/segundo

    //kbps = (Math.round((linespeed*8)*1.024));

    document.getElementById("txtKbps").value =kbps;

    mbps = kbps / 1000 //mbits / segundo

    // -->

    </script>

     

     

    El problema es que no recibo los resultados que espero, es decir lo hago en lan y teoricamente tendría que salir unos 100 mbps las tarjetas y los cables son 10/100 pero me salen como 20mbps, a veces 30 a veces 10 o menos, es una locura.

    Lo he hecho también cargando una imagen y me da incluso menos mbps, he revisado los calculos una y otra vez, llevo mas de una semana con esto y creo que ya estoy cegado y hay cosas que se me escapan.

     

    ¿Alguien me podría dar algun tipo de pista o alguna explicacion de todo esto? 

    Muchas gracias de antemano.

    Dienstag, 4. Dezember 2007 10:22

Alle Antworten

  • Hola de nuevo

     

    Resulta que aun me sigo pegando con este tema.

     

    He conseguido realizar el test y me da buenos resultados, al final los tiros iban por lo de la imagen.

     

    Bien, yo ahora tengo la velocidad de bajada, pero necesito ampliarlo para recoger la velocidad de subida xD

     

    Bueno, lo primero que he pensado ha sido, vale, muy facil, lo hago al reves.

     

    Problemas que me encuentro, no puedo meterme en el ordenador de una persona X cogerle una imagen o un archivito y traermelo a mi servidor (obvio)

    He pensado también en meter la imagen a pelo en un input a traves de asignarle un value via javascript -> no se puede

    Por otro lado también no tengo ni idea de como plantearme el tema de hacer que el servidor cronometre el tiempo que tarda en llegarle un archivo que le manda el cliente.

     

    Todo tiene que ser transparente para el cliente, no me vale que halla un input file y que el usuario meta un archivo etc.

     

    La verdad es que estoy a punto de llegar a la conclusion de que no se puede, me da rabia, pero no me gustaria tener que dejarlo y rendirme.

     

    ¿Alguna idea?, me vale cualquier sugerencia, lo que sea.

     

    Gracias de antemano!

     

    Donnerstag, 10. Januar 2008 13:16
  • Esto lo hizo un compañero mío para realizar test, está en BLOCKED SCRIPT

    <script>
        var siteCounter = 0;
        var siteURIs = new Array("http://www.yahoo.com","http://www.google.com","http://www.live.com","http://www.youtube.com","http://www.msn.com","http://www.myspace.com","http://www.facebook.com","http://www.wikipedia.org","http://www.hi5.com","http://www.orkut.com","http://www.mozilla.org","http://www.php.net","http://www.java.com","http://www.joomla.org","http://java.sun.com/index.jsp","http://www.drupal.org","http://validator.w3.org","http://extensions.joomla.org","http://www.thescripts.com");
        var actualSite = "";
        var initTime;
        var results = "";
        var secondRound = false;
       
        function initTest()
        {
            results = results  + "<span style='color:Red'><b>DONE!</b></span><table><tr><td>Site</td><td>Browser</td><td>Load Time 1</td><td>Load Time 2</td></tr>";
            initSpeedTest();
        }

        function initSpeedTest() {
            if (siteCounter < siteURIs.length)
            {   
                actualSite = siteURIs[siteCounter];
                initTime = new Date();
                document.getElementById("cnt").src = actualSite;
            }
            else
            {
                var log = document.getElementById("log");
           
                results = results + "</table>"
                actualSite = "";
                siteCounter = 0;
               
                document.getElementById("cnt").style.display = "none";
                log.innerHTML = results;
            }
        }

        function siteLoaded() {
            var endTime = new Date;
            if (actualSite != "")
            {
                var diff = (endTime - initTime) / 1000;
               
                if (secondRound)
                {
                    results = results + "<td>" + diff + "</td></tr>"
                    secondRound = false;
                    siteCounter++;
                }
                else
                {
                    results = results + "<tr><td>" + actualSite + "</td><td>" + navigator.appName + "</td><td>" + diff + "</td>";
                    secondRound = true;
                }   
                initSpeedTest();
            }
        }
    </script>

    <button onclick="initTest()">Iniciar Test</button><button onclick="siteLoaded()">Parar Sitio Actual</button><br><br>

    <iframe id="cnt" style="width:640;height:480" onLoad="siteLoaded()"></iframe><br><br>
    <div id="log" style="width:640;height:200"></div>

    Salu2
    Donnerstag, 10. Januar 2008 13:26
  • podrías hacer algo así:

     

    cargar un form en el navegador del cliente.

    este form podría contener en un campo oculto un array de bytes de una extensión conocida de antemano.

    esta la descarga de este form ya te podría ayudar a medir el tiempo de descarga.

     

    una vez que se completa la descarga, con ayuda de un javascript, podrías hacer el post de este mismo formulario al servidor.

     

    Ahora bien, si conoces algo de AJAX, utilizando técnicas de envío y recepción de datos asincrónica podrías manejar todo esto en el background y fácilmente medir el tiempo que transcurre entre el inicio y el final de cada transferencia.

    Donnerstag, 10. Januar 2008 14:50
  • Hola Luis,

     

    Gracias por responder, la verdad es que es muy chulo el codigo e interesante.

     

    Tengo que hacerte una pregunta mas, se que me vais a dar un capon y que decepcionare a mis fans pero () no entiendo que me quieres decir con blocked script, he googleleado un poco y no me aclaro, un block script es lo que hay entre las etiquetas de script, he encontrado también algo como esto

     

    Bloque de código
    cb1.Attributes.Add("onclick", "BLOCKED SCRIPT return ChangeHeaderAsNeeded()");

     

     

     

    No se muy bien que es.

     

    Por otro lado he probado el codigo, y me ha dado ideas y con ellas vienen mas problemas xD

    A ver, yo con lo de la imagen tengo lo de bajada, con texto no me funciona, con un htm incrustado en un iframe no se si funcionaria y me explico:

    Yo me creo una pagina que pese por ejemplo 100k, estatica, ¿realmente estoy cargando 100k? ¿no diferira el tamaño en algun momento? (En cualquier caso el tema de calcular la bajada esta hecho y funciona)

     

    El otro punto sería al realizar la subida, esto lo estoy haciendo para una lan bastante grande con sus vlan sus tropecientas adsl de diferentes operadores, etc. Para hacer este efecto, tendria que enviar un archivo al servidor web desde el cliente pero sin intervencion del mismo. Se me ha pasado por la cabeza fijar un archivo en el disco duro de cada ordenador para pillarlo y enviarlo, pero no es viable (miles de pcs...) ademas de que no puedo solventar el tema de meter mano en el disco duro del cliente jeje.

     

    Tambien me pregunto si es posible que con la imagen que yo le mando al cliente desde el server, éste me la pueda devolver de alguna manera, via post o algo así, con lo que tendria un jpg que no se puede comprimir y de un tamaño fijo que se de antemano y que el servidor sepa cuanto ha tardado en recibir esa imagen, o que el cliente sepa cuanto tarda en subir esa imagen al servidor y luego le mande los tiempos al servidor web.

     

    A lo mejor me estoy dando cabezazos contra la pared, ¿realmente se puede hacer via asp.net/javascript?

     

    no puedo mas
    Donnerstag, 10. Januar 2008 15:28
  • Hola cmsalvatore,

     

    Gracias por la respuesta, esto que comentas es lo que en un principio he intentado para el tema de la velocidad de descarga, pero desgraciadamente los tiempos que me daba eran demasiado dispares por lo que me fui al tema de cargar una imagen, por probar y asi lo consegui.

    ¿Ahora bien, como le envio por el formulario una imagen de vuelta?

     

    La verdad que de AJAX no tengo ni la mas remota idea, pero se me ha pasado por la cabeza tirarme a la piscina a ver si esta calentita. Seguro que hasta es mas facil y todo.

    Aun asi, suelo encontrar test por la red que estan en flash o php (sin el codigo abierto) pero casi no he encontrado test que se hayan hecho en asp para al menos saber que se puede hacer.

     

     

    Donnerstag, 10. Januar 2008 15:34