Skip to Content.
Sympa Menu

ndt-dev - [ndt-dev] [ndt] r859 committed - Added Flash client.

Subject: NDT-DEV email list created

List archive

[ndt-dev] [ndt] r859 committed - Added Flash client.


Chronological Thread 
  • From:
  • To:
  • Subject: [ndt-dev] [ndt] r859 committed - Added Flash client.
  • Date: Sun, 02 Feb 2014 19:14:43 +0000

Revision: 859
Author:

Date: Sun Feb 2 19:14:17 2014 UTC
Log: Added Flash client.

http://code.google.com/p/ndt/source/detail?r=859

Added:
/trunk/flash-client
/trunk/flash-client/AUTHORS
/trunk/flash-client/COPYING
/trunk/flash-client/README
/trunk/flash-client/assets
/trunk/flash-client/assets/hover.png
/trunk/flash-client/assets/mlab-logo.png
/trunk/flash-client/ndt-flash-config.xml
/trunk/flash-client/src
/trunk/flash-client/src/GUI.as
/trunk/flash-client/src/Handshake.as
/trunk/flash-client/src/Main.as
/trunk/flash-client/src/Message.as
/trunk/flash-client/src/MessageType.as
/trunk/flash-client/src/NDTConstants.as
/trunk/flash-client/src/NDTPController.as
/trunk/flash-client/src/NDTUtils.as
/trunk/flash-client/src/TestC2S.as
/trunk/flash-client/src/TestMETA.as
/trunk/flash-client/src/TestResults.as
/trunk/flash-client/src/TestResultsUtils.as
/trunk/flash-client/src/TestS2C.as
/trunk/flash-client/src/TestType.as
/trunk/flash-client/src/UserAgentTools.as
/trunk/flash-client/src/locale
/trunk/flash-client/src/locale/ca_ES
/trunk/flash-client/src/locale/ca_ES/DisplayMessages.properties
/trunk/flash-client/src/locale/el_GR
/trunk/flash-client/src/locale/el_GR/DisplayMessages.properties
/trunk/flash-client/src/locale/en_US
/trunk/flash-client/src/locale/en_US/DisplayMessages.properties
/trunk/flash-client/src/locale/fr_FR
/trunk/flash-client/src/locale/fr_FR/DisplayMessages.properties
/trunk/flash-client/src/locale/nb_NO
/trunk/flash-client/src/locale/nb_NO/DisplayMessages.properties
/trunk/flash-client/src/locale/nl_NL
/trunk/flash-client/src/locale/nl_NL/DisplayMessages.properties
/trunk/flash-client/src/locale/pt_BR
/trunk/flash-client/src/locale/pt_BR/DisplayMessages.properties
/trunk/flash-client/src/locale/ru_RU
/trunk/flash-client/src/locale/ru_RU/DisplayMessages.properties
/trunk/flash-client/src/ndt_test_results.as

=======================================
--- /dev/null
+++ /trunk/flash-client/AUTHORS Sun Feb 2 19:14:17 2014 UTC
@@ -0,0 +1,2 @@
+Anant Subramanian
<>
+Tiziana Refice
<>
=======================================
--- /dev/null
+++ /trunk/flash-client/COPYING Sun Feb 2 19:14:17 2014 UTC
@@ -0,0 +1,177 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
=======================================
--- /dev/null
+++ /trunk/flash-client/README Sun Feb 2 19:14:17 2014 UTC
@@ -0,0 +1,38 @@
+ndt-flash is a Flash implementation of the NDT client.
+NDT (Network Diagnostic Tool) is a client/server program that provides network
+configuration and performance testing to end-users' desktop, laptop, and mobile
+platforms.
+For more information about NDT, see https://code.google.com/p/ndt/.
+
+How to compile :
+1. Download the latest Flex SDK from http://www.adobe.com/devnet/flex/flex-sdk-download.html
+2. Change the current working directory to the location of this README file.
+3. Create frameworks for the missing locales :
+ Call the copylocale in the bin directory of the Flex SDK to create frameworks for the
+ missing locales as below (You should repeat for any locales you want to add other than
+ the default flex supported ones) :
+
+ i. If on Linux/Mac :
+ {path-to-flex-sdk}/bin/copylocale en_US ca_ES
+ {path-to-flex-sdk}/bin/copylocale en_US el_GR
+
+ ii.If on Windows :
+ {path-to-flex-sdk}\bin\copylocale.exe en_US ca_ES
+ {path-to-flex-sdk}\bin\copylocale.exe en_US el_GR
+
+4. Calling mxmlc from the command line :
+ Call the mxmlc in the bin directory of the Flex SDK by passing the Flex configuration
+ file ndt-flash-config.xml and Main.as as arguments :
+
+ i. If on Linux/Mac :
+ {path-to-flex-sdk}/bin/mxmlc src/Main.as -o <Insert_Filename_Here>.swf -load-config+=ndt-flash-config.xml
+
+ ii.If on Windows :
+ {path-to-flex-sdk}\bin\mxmlc.exe src\Main.as -o <Insert_Filename_Here>.swf -load-config+=ndt-flash-config.xml
+
+ Make sure to append ndt-flash-config.xml to -load-config instead of simply equating
+ to ensure the default flex-config.xml file is also loaded as ndt uses crucial properties
+ from that file as well.
+
+4. If there are no compilation errors, your compiled SWF should be created in the current
+ working directory.
=======================================
--- /dev/null
+++ /trunk/flash-client/assets/hover.png Sun Feb 2 19:14:17 2014 UTC
Binary file, no diff available.
=======================================
--- /dev/null
+++ /trunk/flash-client/assets/mlab-logo.png Sun Feb 2 19:14:17 2014 UTC
Binary file, no diff available.
=======================================
--- /dev/null
+++ /trunk/flash-client/ndt-flash-config.xml Sun Feb 2 19:14:17 2014 UTC
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--This Adobe Flex compiler configuration file sets compiler options for the NDT Flash client.-->
+<flex-config>
+ <target-player>11.1</target-player>
+ <benchmark>false</benchmark>
+ <static-link-runtime-shared-libraries>true</static-link-runtime-shared-libraries>
+ <compiler>
+ <define append="true">
+ <name>CONFIG::debug</name>
+ <!--TODO(tiziana): Change to false, right before the first public release. -->
+ <value>true</value>
+ </define>
+ <define append="true">
+ <name>CONFIG::release</name>
+ <value>true</value>
+ </define>
+ <!-- The flag indicating that tests should not be run through the command line without a GUI -->
+ <define append="true">
+ <name>CONFIG::guiEnabled</name>
+ <value>true</value>
+ </define>
+ <!-- The default/fall-back value for the locale if .properties file for another locale is not found -->
+ <define append="true">
+ <name>CONFIG::defaultLocale</name>
+ <value>"en_US"</value>
+ </define>
+ <!-- The current NDT version -->
+ <define append="true">
+ <name>CONFIG::serverVersion</name>
+ <value>"v3.6.5.2"</value>
+ </define>
+ <define append="true">
+ <name>CONFIG::clientVersion</name>
+ <value>"v1.0.0.0"</value>
+ </define>
+ <verbose-stacktraces>true</verbose-stacktraces>
+ <!-- The locales to compile into the application-->
+ <locale>
+ <locale-element>en_US</locale-element>
+ <locale-element>ca_ES</locale-element>
+ <locale-element>el_GR</locale-element>
+ <locale-element>fr_FR</locale-element>
+ <locale-element>nb_NO</locale-element>
+ <locale-element>nl_NL</locale-element>
+ <locale-element>pt_BR</locale-element>
+ <locale-element>ru_RU</locale-element>
+ </locale>
+ <!-- Append paths of source files and locales-->
+ <source-path append="true">
+ <path-element>src/</path-element>
+ <path-element>src/locale/{locale}</path-element>
+ </source-path>
+ <!-- Allow the source-path to have path-elements which contain other path-elements -->
+ <allow-source-path-overlap>true</allow-source-path-overlap>
+ </compiler>
+ <file-specs>
+ <path-element>src/Main.as</path-element>
+ </file-specs>
+ <!-- Gives the green color to the background.-->
+ <default-background-color>#00DBA8</default-background-color>
+ <!-- Set frame rate to maximum possible value '120' to increase Timer Accuracy.-->
+ <default-frame-rate>120</default-frame-rate>
+ <!-- Set stage size of client. -->
+ <default-size>
+ <width>600</width>
+ <height>480</height>
+ </default-size>
+</flex-config>
=======================================
--- /dev/null
+++ /trunk/flash-client/src/GUI.as Sun Feb 2 19:14:17 2014 UTC
@@ -0,0 +1,393 @@
+// Copyright 2013 M-Lab
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package {
+ import flash.display.Graphics;
+ import flash.display.Sprite;
+ import flash.text.TextField;
+ import flash.text.*;
+ import flash.display.Sprite;
+ import flash.events.MouseEvent;
+ import flash.ui.Mouse;
+ import flash.events.Event;
+ import flash.net.*;
+ import flash.display.DisplayObjectContainer;
+ import flash.display.DisplayObject;
+ import flash.filters.BlurFilter;
+ import spark.effects.*;
+
+ /**
+ * This class creates a Flash GUI for the client. The GUI is optional and can
+ * be disabled in the 'Main' class.
+ */
+ public class GUI extends Sprite {
+ [Embed(source="../assets/mlab-logo.png")]
+ private var MLabLogoImg:Class;
+
+ private var _stageWidth:int;
+ private var _stageHeight:int;
+ private var _callerObj:NDTPController;
+
+ private var _mlabLogo:DisplayObject;
+ private var _aboutNDTText:TextField;
+ private var _learnMoreLink:Sprite;
+ private var _urlRequest:URLRequest;
+ private var _startButton:Sprite;
+
+ private var _consoleText:TextField;
+ private var _resultsTextField:TextField;
+ private var _summaryResultText:String;
+ private var _resultsButton:Sprite;
+ private var _detailsButton:Sprite;
+ private var _errorsButton:Sprite;
+ private var _debugButton:Sprite;
+
+ public function GUI(
+ stageWidth:int, stageHeight:int, callerObj:NDTPController) {
+ _stageWidth = stageWidth;
+ _stageHeight = stageHeight;
+ _callerObj = callerObj;
+
+ // Create objects of the initial screen.
+ // 1) M-Lab logo
+ _mlabLogo = new MLabLogoImg();
+
+ // 2) About NDT
+ var aboutNDTTextFormat:TextFormat = new TextFormat();
+ aboutNDTTextFormat.size = 14;
+ aboutNDTTextFormat.font = "Verdana";
+ aboutNDTTextFormat.align = TextFormatAlign.CENTER;
+ aboutNDTTextFormat.color = 0x000000;
+ _aboutNDTText = new TextField();
+ _aboutNDTText.defaultTextFormat = aboutNDTTextFormat;
+ _aboutNDTText.width = 0.75 * _stageWidth;
+ _aboutNDTText.height = 0.40 * _stageHeight;
+ _aboutNDTText.wordWrap = true;
+ _aboutNDTText.selectable = false;
+ _aboutNDTText.text = "Network Diagnostic Tool (NDT) provides a "
+ + "sophisticated speed and diagnostic test. An NDT "
+ + "test reports more than just the upload and "
+ + "download speeds -- it also attempts to determine "
+ + "what, if any, problems limited these speeds, "
+ + "differentiating between computer configuration "
+ + "and network infrastructure problems. While the "
+ + "diagnostic messages are most useful for expert "
+ + "users, they can also help novice users by "
+ + "allowing them to provide detailed trouble "
+ + "reports to their network administrator.";
+
+ // 3) Learn more link
+ _urlRequest = new URLRequest(NDTConstants.MLAB_SITE);
+ var learnMoreTextFormat:TextFormat = new TextFormat();
+ learnMoreTextFormat.size = 14;
+ learnMoreTextFormat.font = "Verdana";
+ learnMoreTextFormat.underline = true;
+ learnMoreTextFormat.align = TextFormatAlign.CENTER;
+ learnMoreTextFormat.color = 0x000000;
+ var learnMoreText:TextField = new TextField();
+ learnMoreText.defaultTextFormat = learnMoreTextFormat;
+ learnMoreText.text = "Learn more about Measurement Lab";
+ _learnMoreLink = new Sprite();
+ _learnMoreLink.addChild(learnMoreText);
+ _learnMoreLink.buttonMode = true;
+ _learnMoreLink.mouseChildren = false;
+ _learnMoreLink.width = 0.50 * _stageWidth;
+
+ // 4) Start button
+ _startButton = new NDTButton("START", 30, 45, 0.4);
+
+ // Position objects within initial screen, using a relative layout.
+ _mlabLogo.x = (_stageWidth / 2) - (_mlabLogo.width / 2);
+ _aboutNDTText.x = _stageWidth / 2 - _aboutNDTText.width / 2;
+ _learnMoreLink.x = _stageWidth / 2 - _learnMoreLink.width / 2;
+ _startButton.x = _stageWidth / 2;
+ var verticalMargin:Number = (_stageHeight - (
+ _mlabLogo.height + _aboutNDTText.height + _learnMoreLink.height
+ + _startButton.height)) / 5;
+ _mlabLogo.y = verticalMargin;
+ _aboutNDTText.y = _mlabLogo.y + _mlabLogo.height + verticalMargin;
+ _learnMoreLink.y = _aboutNDTText.y + _aboutNDTText.height;
+ + verticalMargin;
+ _startButton.y = _learnMoreLink.y + _learnMoreLink.height
+ + verticalMargin;
+
+ // Add initial event listeners.
+ _learnMoreLink.addEventListener(MouseEvent.CLICK, clickLearnMoreLink);
+ _startButton.addEventListener(MouseEvent.ROLL_OVER, rollOver);
+ _startButton.addEventListener(MouseEvent.ROLL_OUT, rollOut);
+ _startButton.addEventListener(MouseEvent.CLICK, clickStart);
+
+ // Add objects to the initial screen.
+ this.addChild(_mlabLogo);
+ this.addChild(_aboutNDTText);
+ this.addChild(_learnMoreLink);
+ this.addChild(_startButton);
+ }
+
+ private function clickLearnMoreLink(e:MouseEvent):void {
+ try {
+ navigateToURL(_urlRequest);
+ } catch (error:Error) {
+ TestResults.appendErrMsg(error.toString());
+ }
+ }
+
+ private function rollOver(e:MouseEvent):void {
+ e.target.alpha = 0.8;
+ }
+
+ private function rollOut(e:MouseEvent):void {
+ e.target.alpha = 1;
+ }
+
+ private function clickStart(e:MouseEvent):void {
+ hideInitialScreen();
+ _consoleText = new ResultsTextField();
+ _consoleText.scrollV = 0;
+ _consoleText.x = 0.02 * _stageWidth;
+ _consoleText.y = 0.02 * _stageHeight;
+ _consoleText.width = 0.96 * _stageWidth;
+ _consoleText.height = 0.96 * _stageHeight;
+ this.addChild(_consoleText);
+ _callerObj.startNDTTest();
+ }
+
+ private function hideInitialScreen():void {
+ while (this.numChildren > 0)
+ this.removeChildAt(0);
+
+ _learnMoreLink.removeEventListener(MouseEvent.CLICK, clickLearnMoreLink);
+ _startButton.removeEventListener(MouseEvent.ROLL_OVER, rollOver);
+ _startButton.removeEventListener(MouseEvent.ROLL_OUT, rollOut);
+ _startButton.removeEventListener(MouseEvent.CLICK, clickStart);
+ }
+
+ /**
+ * Add text to the console while the NDT test is running.
+ */
+ public function addConsoleOutput(text:String):void {
+ _consoleText.appendText(text);
+ _consoleText.scrollV++;
+ }
+
+ private function hideConsoleScreen():void {
+ while (this.numChildren)
+ this.removeChildAt(0);
+ }
+
+ public function displayResults():void {
+ hideConsoleScreen();
+
+ var resultsRect:Sprite = new Sprite();
+ resultsRect.x = 0.25 * _stageWidth;
+ resultsRect.graphics.beginFill(0);
+ resultsRect.graphics.drawRect(0, 0, 0.75 *_stageWidth, _stageHeight);
+ resultsRect.graphics.endFill();
+ resultsRect.alpha = 0.125;
+ var blur:BlurFilter = new BlurFilter(16.0, 0, 1);
+ resultsRect.filters = [blur];
+ this.addChild(resultsRect);
+
+ _resultsTextField = new ResultsTextField();
+ _resultsTextField.x = 0.275 * _stageWidth;
+ _resultsTextField.y = 0.05 * _stageHeight;
+ _resultsTextField.width = 0.725 * _stageWidth;
+ _resultsTextField.height = 0.90 * _stageHeight;
+ this.addChild(_resultsTextField);
+
+ _resultsButton = new NDTButton("RESULTS", 18, 30, 0.25);
+ _detailsButton = new NDTButton("DETAILS", 18, 30, 0.25);
+ _errorsButton = new NDTButton("ERRORS", 18, 30, 0.25);
+ if (CONFIG::debug)
+ _debugButton = new NDTButton("DEBUG", 18, 30, 0.25);
+
+ var verticalMargin:Number = _stageHeight / 4;
+ if (CONFIG::debug)
+ verticalMargin = _stageHeight / 5;
+ _resultsButton.y = verticalMargin;
+ _detailsButton.y = _resultsButton.y + verticalMargin;
+ _errorsButton.y = _detailsButton.y + verticalMargin;
+ _debugButton.y = _errorsButton.y + verticalMargin;
+ _resultsButton.x += _resultsButton.width / 2;
+ _detailsButton.x += _detailsButton.width / 2;
+ _errorsButton.x += _errorsButton.width / 2;
+ _debugButton.x += _debugButton.width / 2;
+
+ this.addChild(_resultsButton);
+ this.addChild(_detailsButton);
+ this.addChild(_errorsButton);
+ if (_debugButton)
+ this.addChild(_debugButton);
+
+ _resultsButton.addEventListener(MouseEvent.ROLL_OVER, rollOver);
+ _detailsButton.addEventListener(MouseEvent.ROLL_OVER, rollOver);
+ _errorsButton.addEventListener(MouseEvent.ROLL_OVER, rollOver);
+ if (_debugButton)
+ _debugButton.addEventListener(MouseEvent.ROLL_OVER, rollOver);
+
+ _resultsButton.addEventListener(MouseEvent.ROLL_OUT, rollOut);
+ _detailsButton.addEventListener(MouseEvent.ROLL_OUT, rollOut);
+ _errorsButton.addEventListener(MouseEvent.ROLL_OUT, rollOut);
+ if (_debugButton)
+ _debugButton.addEventListener(MouseEvent.ROLL_OUT, rollOut);
+
+ _resultsButton.addEventListener(MouseEvent.CLICK, clickResults);
+ _detailsButton.addEventListener(MouseEvent.CLICK, clickDetails);
+ _errorsButton.addEventListener(MouseEvent.CLICK, clickErrors);
+ if (_debugButton)
+ _debugButton.addEventListener(MouseEvent.CLICK, clickDebug);
+
+ setSummaryResultText();
+ _resultsTextField.htmlText = _summaryResultText;
+ }
+
+ private function setSummaryResultText():void {
+ _summaryResultText = new String();
+ _summaryResultText = (
+ "<p><font size=\"16\">" + "NDT test run towards M-Lab server<br>"
+ + "<b>" + Main.server_hostname + "</b></font><br><br>");
+
+ if (TestResults.ndt_test_results::ndtVariables[NDTConstants.MINRTT]) {
+ _summaryResultText += (
+ "<p><font size=\"16\">" + "RTT between client and M-Lab server<br>"
+ + "<p><font size=\"30\">"
+ + TestResults.ndt_test_results::ndtVariables[NDTConstants.MINRTT]
+ + "</font> ms</font><br><br>");
+ }
+
+ if ((TestResults.ndt_test_results::testsConfirmedByServer & TestType.S2C)
+ == TestType.S2C) {
+ if (!TestResults.ndt_test_results::s2cTestSuccess)
+ _summaryResultText += (
+ "<p><font size=\"18\" color=\"#FF0000\">"
+ + "Download test FAILED! View Errors for details.</font>");
+ else {
+ // Print results in the most convinient units.
+ _summaryResultText += (
+ "<p><font size=\"16\">" + "DOWNLOAD SPEED<br>");
+ if (TestResults.ndt_test_results::s2cSpeed < 1.0)
+ _summaryResultText += (
+ "<p><font size=\"30\">"
+ + TestResults.ndt_test_results::s2cSpeed.toFixed(1)
+ + "</font> kbps</font><br><br>");
+ else
+ _summaryResultText += (
+ "<p><font size=\"30\">"
+ + (TestResults.ndt_test_results::s2cSpeed / 1000).toFixed(1)
+ + "</font> Mbps</font><br><br>");
+ }
+ }
+ if ((TestResults.ndt_test_results::testsConfirmedByServer & TestType.C2S)
+ == TestType.C2S) {
+ if (!TestResults.ndt_test_results::c2sTestSuccess)
+ _summaryResultText += (
+ "<p><font size=\"18\" color=\"#FF0000\">"
+ + "Upload test FAILED! View Errors for details.</font>");
+ else {
+ // Print results in the most convinient units.
+ _summaryResultText += (
+ "<p><fonit size=\"16\">" + "UPLOAD SPEED<br>");
+ if (TestResults.ndt_test_results::c2sSpeed < 1.0)
+ _summaryResultText += (
+ "<p><font size=\"30\">"
+ + TestResults.ndt_test_results::c2sSpeed.toFixed(1)
+ + "</font> kbps</font><br><br>");
+ else
+ _summaryResultText += (
+ "<p><font size=\"30\">"
+ + (TestResults.ndt_test_results::c2sSpeed / 1000).toFixed(1)
+ + "</font> Mbps</font><br><br>");
+ }
+ }
+ }
+
+ private function clickResults(e:MouseEvent):void {
+ _resultsTextField.htmlText = _summaryResultText;
+ _resultsTextField.scrollV = 0;
+ }
+
+ private function clickDetails(e:MouseEvent):void {
+ _resultsTextField.htmlText = "<font size=\"14\">"
+ + TestResults.getResultDetails();
+ _resultsTextField.scrollV = 0;
+ }
+
+ private function clickDebug(e:MouseEvent):void {
+ _resultsTextField.htmlText = "<font size=\"14\">"
+ + TestResults.getDebugMsg();
+ _resultsTextField.scrollV = 0;
+ }
+
+ private function clickErrors(e:MouseEvent):void {
+ _resultsTextField.htmlText = "<font size=\"14\">"
+ + TestResults.getErrMsg();
+ _resultsTextField.scrollV = 0;
+ }
+ }
+}
+
+import flash.display.DisplayObject;
+import flash.display.Sprite;
+import flash.text.*;
+
+class NDTButton extends Sprite {
+ [Embed(source="../assets/hover.png")]
+ private var ButtonImg:Class;
+
+ function NDTButton(text:String, textSize:int, height:int, prop:Number) {
+ super();
+ this.buttonMode = true;
+
+ var textFormat:TextFormat = new TextFormat();
+ textFormat.size = textSize;
+ textFormat.font = "Verdana";
+ textFormat.bold = true;
+ textFormat.align = TextFormatAlign.CENTER;
+ textFormat.color = 0xFFFFFF;
+ var textField:TextField = new TextField();
+ textField.defaultTextFormat = textFormat;
+ textField.text = text;
+
+ var buttonShape:DisplayObject = new ButtonImg();
+
+ buttonShape.width *= prop;
+ buttonShape.height *= prop;
+ buttonShape.x -= buttonShape.width / 2;
+ buttonShape.y -= buttonShape.height / 2;
+ textField.width = buttonShape.width;
+ textField.height = height;
+ textField.x -= textField.width / 2;
+ textField.y -= textField.height / 2;
+
+ this.addChild(buttonShape);
+ this.addChild(textField);
+ this.mouseChildren = false;
+ }
+}
+
+class ResultsTextField extends TextField {
+ public function ResultsTextField() {
+ super();
+ this.wordWrap = true;
+ this.multiline = true;
+ this.antiAliasType = flash.text.AntiAliasType.ADVANCED;
+ var textFormat:TextFormat = new TextFormat();
+ textFormat.size = 14;
+ textFormat.font = "Verdana";
+ textFormat.color = 0x000000;
+ textFormat.align = TextFormatAlign.LEFT;
+ this.defaultTextFormat = textFormat;
+ }
+}
+
=======================================
--- /dev/null
+++ /trunk/flash-client/src/Handshake.as Sun Feb 2 19:14:17 2014 UTC
@@ -0,0 +1,323 @@
+// Copyright 2013 M-Lab
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package {
+ import flash.events.ProgressEvent;
+ import flash.net.Socket;
+ import flash.utils.ByteArray;
+ import mx.resources.ResourceManager;
+ import mx.utils.StringUtil;
+
+ /**
+ * This class handles the initial communication with the server before
+ * starting the measurement tests.
+ */
+ public class Handshake {
+ // Valid values for _testStage.
+ private const KICK_CLIENTS:int = 0;
+ private const SRV_QUEUE1:int = 1;
+ private const SRV_QUEUE2:int = 2;
+ private const VERIFY_VERSION1:int = 3;
+ private const VERIFY_VERSION2:int = 4;
+ private const VERIFY_SUITE1:int = 5;
+ private const VERIFY_SUITE2:int = 6;
+
+ private var _callerObj:NDTPController;
+ private var _ctlSocket:Socket;
+ private var _msg:Message;
+ private var _testStage:int;
+ private var _testsRequestByClient:int;
+ // Has the client already received a wait message?
+ private var _isNotFirstWaitFlag:Boolean;
+
+ public function Handshake(ctlSocket:Socket, testsRequestByClient:int,
+ callerObject:NDTPController) {
+ _callerObj = callerObject;
+ _ctlSocket = ctlSocket;
+ _testsRequestByClient = testsRequestByClient;
+
+ _isNotFirstWaitFlag = false; // No wait messages received yet.
+ }
+
+ public function run():void {
+ var msgBody:ByteArray = new ByteArray();
+ msgBody.writeByte(_testsRequestByClient);
+ _msg = new Message(MessageType.MSG_LOGIN, msgBody);
+ if (!_msg.sendMessage(_ctlSocket)) {
+ failHandshake();
+ }
+
+ addOnReceivedDataListener();
+ _msg = new Message();
+ _testStage = KICK_CLIENTS;
+ TestResults.appendDebugMsg("Handshake: KICK_CLIENTS stage.");
+ if (_ctlSocket.bytesAvailable > 0)
+ // In case data arrived before starting the onReceiveData listener.
+ kickOldClients();
+ }
+
+ private function addOnReceivedDataListener():void {
+ _ctlSocket.addEventListener(ProgressEvent.SOCKET_DATA, onReceivedData);
+ }
+
+ private function removeOnReceivedDataListener():void {
+ _ctlSocket.removeEventListener(ProgressEvent.SOCKET_DATA, onReceivedData);
+ }
+
+ private function onReceivedData(e:ProgressEvent):void {
+ switch (_testStage) {
+ case KICK_CLIENTS: kickOldClients();
+ break;
+ case SRV_QUEUE1: srvQueue1();
+ break;
+ case SRV_QUEUE2: srvQueue2();
+ break;
+ case VERIFY_VERSION1: verifyVersion1();
+ break;
+ case VERIFY_VERSION2: verifyVersion2();
+ break;
+ case VERIFY_SUITE1: verifySuite1();
+ break;
+ case VERIFY_SUITE2: verifySuite2();
+ break;
+ }
+ }
+
+ private function kickOldClients():void {
+ _msg = new Message();
+ if (!_msg.readBody(_ctlSocket, NDTConstants.KICK_OLD_CLIENTS_MSG_LENGTH))
+ return;
+
+ _msg = new Message();
+ _testStage = SRV_QUEUE1;
+ TestResults.appendDebugMsg("Handshake: SRV_QUEUE stage.");
+ if (_ctlSocket.bytesAvailable > 0) {
+ // If KICK_CLIENTS and SRV_QUEUE messages arrive together at the client,
+ // they trigger a single ProgressEvent.SOCKET_DATA event. In such case,
+ // it's necessary to explicitly call the following function to move to
+ // the next step.
+ srvQueue1();
+ }
+ }
+
+ private function srvQueue1():void {
+ if (!_msg.readHeader(_ctlSocket))
+ return;
+
+ _testStage = SRV_QUEUE2;
+ if (_ctlSocket.bytesAvailable > 0)
+ // In case header and body have arrive together at the client, they
+ // trigger a single ProgressEvent.SOCKET_DATA event. In such case,
+ // it's necessary to explicitly call the following function to move to
+ // the next step.
+ srvQueue2();
+ }
+
+ private function srvQueue2():void {
+ if (!_msg.readBody(_ctlSocket, _msg.length))
+ return;
+
+ if (_msg.type != MessageType.SRV_QUEUE) {
+ TestResults.appendErrMsg(ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "loggingWrongMessage", null,
+ Main.locale));
+ failHandshake();
+ }
+
+ var waitFlagString:String = new String(_msg.body);
+ TestResults.appendDebugMsg("Received wait flag = " + waitFlagString);
+ var waitFlag:int = parseInt(waitFlagString);
+
+ // Handle different queued-client cases.
+ // See https://code.google.com/p/ndt/issues/detail?id=101.
+ switch(waitFlag) {
+ case NDTConstants.SRV_QUEUE_TEST_STARTS_NOW:
+ // No more waiting. Proceed.
+ TestResults.appendDebugMsg("Finished waiting.");
+ _msg = new Message();
+ _testStage = VERIFY_VERSION1;
+ TestResults.appendDebugMsg("Handshake: VERIFY_VERSION stage.");
+
+ if(_ctlSocket.bytesAvailable > 0)
+ // If SRV_QUEUE and VERIFY_VERSION messages arrive together at the
+ // client, they trigger a single ProgressEvent.SOCKET_DATA event. In
+ // such case, it's necessary to explicitly call the following
+ // function.
+ verifyVersion1();
+ return;
+
+ case NDTConstants.SRV_QUEUE_SERVER_FAULT:
+ // Server fault. Fail.
+ // TODO(tiziana): Change when issue #102 is fixed.
+ // See https://code.google.com/p/ndt/issues/detail?id=102.
+ TestResults.appendErrMsg(ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "serverFault", null, Main.locale));
+ failHandshake();
+ return;
+
+ case NDTConstants.SRV_QUEUE_SERVER_BUSY:
+ if (!_isNotFirstWaitFlag) {
+ // Server busy. Fail.
+ // TODO(tiziana): Change when issue #102 is fixed.
+ // See https://code.google.com/p/ndt/issues/detail?id=102.
+ TestResults.appendErrMsg(ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "serverBusy",null, Main.locale));
+ failHandshake();
+ } else {
+ // Server fault. Fail.
+ // TODO(tiziana): Change when issue #102 is fixed.
+ // See https://code.google.com/p/ndt/issues/detail?id=102.
+ TestResults.appendErrMsg(ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "serverFault", null, Main.locale));
+ failHandshake();
+ }
+ return;
+
+ case NDTConstants.SRV_QUEUE_SERVER_BUSY_60s:
+ // Server busy for 60s. Fail.
+ // TODO(tiziana): Change when issue #102 is fixed.
+ // See https://code.google.com/p/ndt/issues/detail?id=102.
+ TestResults.appendErrMsg(ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "serverBusy60s", null, Main.locale));
+ failHandshake();
+ return;
+
+ case NDTConstants.SRV_QUEUE_HEARTBEAT:
+ // Server sends signal to see if client is still alive.
+ // Client should respond with a MSG_WAITING message.
+ var _msgBody:ByteArray = new ByteArray();
+ _msgBody.writeByte(_testsRequestByClient);
+ _msg = new Message(MessageType.MSG_WAITING, _msgBody);
+ if (!_msg.sendMessage(_ctlSocket)) {
+ failHandshake();
+ }
+
+ default:
+ // Server sends the number of queued clients (== number of minutes
+ // to wait before starting tests).
+ // See https://code.google.com/p/ndt/issues/detail?id=103.
+ TestResults.appendDebugMsg(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "otherClient", null, Main.locale)
+ + (waitFlag * 60)
+ + ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "seconds", null, Main.locale));
+ _isNotFirstWaitFlag = false; // First message from server received.
+ }
+ }
+
+ private function verifyVersion1():void {
+ if (!_msg.readHeader(_ctlSocket))
+ return;
+
+ _testStage = VERIFY_VERSION2;
+ if (_ctlSocket.bytesAvailable > 0)
+ // In case header and body have arrive together at the client, they
+ // trigger a single ProgressEvent.SOCKET_DATA event. In such case,
+ // it's necessary to explicitly call the following function to move to
+ // the next step.
+ verifyVersion2();
+ }
+
+ private function verifyVersion2():void {
+ if (!_msg.readBody(_ctlSocket, _msg.length))
+ return;
+
+ if (_msg.type != MessageType.MSG_LOGIN) {
+ TestResults.appendErrMsg(ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "versionWrongMessage", null,
+ Main.locale));
+ failHandshake();
+ return;
+ }
+
+ var receivedServerVersion:String = new String(_msg.body);
+ TestResults.appendDebugMsg("Server version: " + receivedServerVersion);
+ // See https://code.google.com/p/ndt/issues/detail?id=104.
+ if (receivedServerVersion != NDTConstants.EXPECTED_SERVER_VERSION)
+ TestResults.appendDebugMsg(
+ "The server version sent by the server is: "
+ + receivedServerVersion
+ + ", while the client expects: "
+ + NDTConstants.EXPECTED_SERVER_VERSION);
+ if (receivedServerVersion < NDTConstants.LAST_VALID_SERVER_VERSION) {
+ TestResults.appendErrMsg(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "incompatibleVersion",null,
+ Main.locale));
+ failHandshake();
+ return;
+ }
+
+ _msg = new Message();
+ _testStage = VERIFY_SUITE1;
+ TestResults.appendDebugMsg("Handshake: VERIFY_SUITE stage.");
+
+ if (_ctlSocket.bytesAvailable > 0) {
+ // If VERIFY_VERSION and VERIFY_SUITE messages arrive together at the
+ // client, they trigger a single ProgressEvent.SOCKET_DATA event. In
+ // such case, it's necessary to explicitly call the following function
+ // to move to the next step.
+ verifySuite1();
+ }
+ }
+
+ private function verifySuite1():void {
+ if (!_msg.readHeader(_ctlSocket))
+ return;
+
+ _testStage = VERIFY_SUITE2;
+ if (_ctlSocket.bytesAvailable > 0)
+ // In case header and body have arrive together at the client, they
+ // trigger a single ProgressEvent.SOCKET_DATA event. In such case,
+ // it's necessary to explicitly call the following function to move to
+ // the next step.
+ verifySuite2();
+ }
+
+ private function verifySuite2():void {
+ if (!_msg.readBody(_ctlSocket, _msg.length))
+ return;
+
+ if (_msg.type != MessageType.MSG_LOGIN) {
+ TestResults.appendErrMsg(ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "testsuiteWrongMessage", null,
+ Main.locale));
+ return;
+ }
+
+ var confirmedTests:String = new String(_msg.body);
+ TestResults.ndt_test_results::testsConfirmedByServer =
+ TestType.listToBitwiseOR(confirmedTests);
+
+ TestResults.appendDebugMsg("Test suite: " + confirmedTests);
+ endHandshake(StringUtil.trim(confirmedTests));
+ }
+
+ private function failHandshake():void {
+ TestResults.appendDebugMsg("Handshake: FAIL.");
+
+ removeOnReceivedDataListener();
+ _callerObj.failNDTTest();
+ }
+
+ private function endHandshake(confirmedTests:String):void {
+ TestResults.appendDebugMsg("Handshake: END.");
+
+ removeOnReceivedDataListener();
+ _callerObj.initiateTests(confirmedTests);
+ }
+ }
+}
+
=======================================
--- /dev/null
+++ /trunk/flash-client/src/Main.as Sun Feb 2 19:14:17 2014 UTC
@@ -0,0 +1,61 @@
+// Copyright 2013 M-Lab
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package {
+ import flash.display.Sprite;
+ import flash.events.Event;
+ import mx.resources.ResourceBundle;
+ /**
+ * @author Anant Subramanian
+ */
+
+ [ResourceBundle("DisplayMessages")]
+ public class Main extends Sprite {
+ public static var guiEnabled:Boolean = CONFIG::guiEnabled;
+ public static var locale:String = CONFIG::defaultLocale;
+ public static var gui:GUI;
+ public static var server_hostname:String = NDTConstants.SERVER_HOSTNAME;
+
+ public function Main():void {
+ if (stage)
+ init();
+ else
+ addEventListener(Event.ADDED_TO_STAGE, init);
+ }
+
+ /**
+ * Function that is called once the stage is initialized and an instance of
+ * this class has been added to it. Sets the locale value according to the
+ * SWF environment and creates an NDTPController object to start an NDT test
+ */
+ private function init(e:Event = null):void {
+ removeEventListener(Event.ADDED_TO_STAGE, init);
+
+ // Set the properties of the SWF from HTML tags.
+ NDTUtils.initializeFromHTML(this.root.loaderInfo.parameters);
+
+ var frame:NDTPController = new NDTPController(server_hostname);
+
+ stage.showDefaultContextMenu = false;
+ if (guiEnabled) {
+ gui = new GUI(stage.stageWidth, stage.stageHeight, frame);
+ this.addChild(gui);
+ } else {
+ // If guiEnabled compiler flag set to false, start test immediately.
+ frame.startNDTTest();
+ }
+ NDTUtils.addJSCallbacks();
+ }
+ }
+}
=======================================
--- /dev/null
+++ /trunk/flash-client/src/Message.as Sun Feb 2 19:14:17 2014 UTC
@@ -0,0 +1,115 @@
+// Copyright 2013 M-Lab
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package {
+ import flash.errors.IOError;
+ import flash.net.Socket;
+ import flash.utils.ByteArray;
+
+ /**
+ * Class that defines an NDT message. A message is characterized by a type,
+ * a length and a body. All the types are defined in the class MessageType.
+ * All the valid types are defined in the class MessageType.
+ * The client and server exchange messages as sequence of bytes, where
+ * - the 1st byte contains the type of a message,
+ * - the 2nd and 3rd bytes contain the length of the message.
+ */
+ public class Message {
+ private var _type:int;
+ private var _body:ByteArray;
+ private var _length:int;
+
+ public function Message(
+ type:int=MessageType.UNDEF_TYPE, body:ByteArray=null):void {
+ _type = type;
+ _body = new ByteArray();
+ if (body != null)
+ _body.writeBytes(body);
+ _length = _body.length;
+ }
+
+ public function get type():int {
+ return _type;
+ }
+
+ public function get length():int {
+ return _length;
+ }
+
+ public function get body():ByteArray {
+ return _body;
+ }
+
+ public function readHeader(socket:Socket):Boolean {
+ if (socket.bytesAvailable < NDTConstants.MSG_HEADER_LENGTH)
+ return false;
+
+ var header:ByteArray = new ByteArray();
+ var bytesRead:int = NDTUtils.readBytes(
+ socket, header, 0, NDTConstants.MSG_HEADER_LENGTH);
+ if(bytesRead != NDTConstants.MSG_HEADER_LENGTH) {
+ // This case should never occurr.
+ TestResults.appendErrMsg("Error reading header from socket. Only "
+ + bytesRead + " bytes read");
+ return false;
+ }
+ _type = header[0]
+ _length = (int(header[1]) & 0xFF) << 8;
+ _length += int(header[2]) & 0xFF;
+ return true;
+ }
+
+ public function readBody(socket:Socket, bytesToRead:int):Boolean {
+ if (socket.bytesAvailable < bytesToRead)
+ return false;
+
+ _body = new ByteArray();
+ var bytesRead:int = NDTUtils.readBytes(socket, _body, 0, bytesToRead);
+ if(bytesRead != bytesToRead) {
+ // This case should never occurr.
+ TestResults.appendErrMsg("Error reading body from socket. Only "
+ + bytesRead + " bytes read.");
+ return false;
+ }
+ return true;
+ }
+
+ public function sendMessage(socket:Socket):Boolean {
+ var header:ByteArray = new ByteArray();
+ header[0] = _type;
+ header[1] = (_length >> 8);
+ header[2] = _length;
+ try {
+ socket.writeBytes(header);
+ } catch(e:IOError) {
+ TestResults.appendErrMsg("Error writing header to socket: " + e);
+ return false;
+ }
+ try {
+ socket.writeBytes(_body);
+ } catch(e:IOError) {
+ TestResults.appendErrMsg("Error writing body to socket: " + e);
+ return false;
+ }
+ try {
+ socket.flush();
+ } catch(e:IOError) {
+ TestResults.appendErrMsg("Error flushing socket: " + e);
+ return false;
+ }
+ return true;
+ }
+ }
+}
+
=======================================
--- /dev/null
+++ /trunk/flash-client/src/MessageType.as Sun Feb 2 19:14:17 2014 UTC
@@ -0,0 +1,36 @@
+// Copyright 2013 M-Lab
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package {
+ /**
+ * Class that defines the NDTP control message types, as expected by the NDT
+ * server.
+ */
+ public class MessageType {
+ public static const UNDEF_TYPE:int = -1;
+ public static const COMM_FAILURE:int = 0;
+ public static const SRV_QUEUE:int = 1;
+ public static const MSG_LOGIN:int = 2;
+ public static const TEST_PREPARE:int = 3;
+ // TODO(tiziana): Add check in Message.sendMessage for length constrains.
+ public static const TEST_START:int = 4;
+ public static const TEST_MSG:int = 5;
+ public static const TEST_FINALIZE:int = 6;
+ public static const MSG_ERROR:int = 7;
+ public static const MSG_RESULTS:int = 8;
+ public static const MSG_LOGOUT:int = 9;
+ public static const MSG_WAITING:int = 10;
+ }
+}
+
=======================================
--- /dev/null
+++ /trunk/flash-client/src/NDTConstants.as Sun Feb 2 19:14:17 2014 UTC
@@ -0,0 +1,222 @@
+// Copyright 2013 M-Lab
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package {
+ public class NDTConstants {
+ public static const MLAB_SITE:String = "http://www.measurementlab.net";;
+
+ public static const CLIENT_VERSION:String = CONFIG::clientVersion;
+ public static const EXPECTED_SERVER_VERSION:String = CONFIG::serverVersion;
+ // The current version of the protocol is backward compatible to v3.3.12.
+ public static const LAST_VALID_SERVER_VERSION:String = "v3.3.12";
+ public static const CLIENT_ID:String = "swf";
+ // Client MUST request the TEST_STATUS.
+ public static const TESTS_REQUESTED_BY_CLIENT:int =
+ TestType.C2S | TestType.S2C | TestType.META | TestType.STATUS;
+ // TODO(tiziana): Get hostname from mlab-ns.
+ public static const SERVER_HOSTNAME:String =
+ "ndt.iupui.mlab1.nuq0t.measurement-lab.org";
+ // For localization.
+ public static const BUNDLE_NAME:String = "DisplayMessages";
+
+ public static const PROTOCOL_MSG_READ_SUCCESS:int = 0;
+ public static const PROTOCOL_MSG_READ_ERROR:int = 1;
+ public static const MSG_HEADER_LENGTH:int = 3;
+ public static const KICK_OLD_CLIENTS_MSG_LENGTH:int = 13;
+ public static const SRV_QUEUE_MSG_LENGTH:int = 4;
+ public static const DEFAULT_CONTROL_PORT:uint = 3001;
+
+ // SRV-QUEUE status.
+ public static const SRV_QUEUE_HEARTBEAT:int = 9990;
+ public static const SRV_QUEUE_SERVER_BUSY:int = 9988;
+ public static const SRV_QUEUE_SERVER_BUSY_60s:int = 9999;
+ public static const SRV_QUEUE_SERVER_FAULT:int = 9977;
+ public static const SRV_QUEUE_TEST_STARTS_NOW:int = 0;
+
+ // META test result fields.
+ public static const META_CLIENT_OS:String = "client.os.name";
+ public static const META_CLIENT_BROWSER:String = "client.browser.name";
+ public static const META_CLIENT_KERNEL_VERSION:String =
+ "client.kernel.version";
+ public static const META_CLIENT_VERSION:String = "client.version";
+ public static const META_CLIENT_APPLICATION:String = "client.application";
+
+ // Allow the client to run the S2C and the C2S tests longer than 10sec.
+ // This will cause the server to close the test sockets.
+ public static const C2S_DURATION:int = 15000; // 15sec
+ public static const S2C_DURATION:int = 15000; // 15sec
+ // TCP constants.
+ // Max size that can be sent, because 2 bytes are used to hold data length.
+ public static const TCP_MAX_RECV_WIN_SIZE:int = 65535; // bytes
+ // According to RFC1323, Section 2.3 the max valid value of iWinScaleRcvd is
+ // 14. NDT uses 20 for this, leaving for now in case it is an error value.
+ // TODO(tiziana): Check if the value is correct.
+ public static const TCP_MAX_WINSCALERCVD:int = 20;
+ public static const PREDEFINED_BUFFER_SIZE:int = 8192; // bytes
+
+ // NDT specific limits.
+ // See http://www.web100.org/download/kernel/tcp-kis.txt.
+ public static const SND_LIM_TIME_THRESHOLD:Number = 0.15;
+ // If the congestion windows is limited more than 0.5% of the time, NDT
+ // claims that the connection is network limited.
+ public static const CWND_LIM_TIME_THRESHOLD:Number = 0.005;
+ // If the link speed is less than a T3, and loss is greater than 1 percent,
+ // loss is determined to be excessive.
+ public static const LOSS_THRESHOLD:Number = 0.01;
+
+ // Line speed indicators as defined by the NDT server.
+ public static const DATA_RATE_INSUFFICIENT_DATA:int = -2;
+ public static const DATA_RATE_SYSTEM_FAULT:int = -1;
+ public static const DATA_RATE_RTT:int = 0;
+ public static const DATA_RATE_DIAL_UP:int = 1;
+ public static const DATA_RATE_T1:int = 2;
+ public static const DATA_RATE_ETHERNET:int = 3;
+ public static const DATA_RATE_T3:int = 4;
+ public static const DATA_RATE_FAST_ETHERNET:int = 5;
+ public static const DATA_RATE_OC_12:int = 6;
+ public static const DATA_RATE_GIGABIT_ETHERNET:int = 7;
+ public static const DATA_RATE_OC_48:int = 8;
+ public static const DATA_RATE_10G_ETHERNET:int = 9;
+
+ public static const ACCESS_TECH_UNKNOWN:String = "Connection type unknown";
+ public static const ACCESS_TECH_DIALUP:String = "Dial-up Modem";
+ public static const ACCESS_TECH_CABLEDSL:String = "Cable/DSL modem";
+ public static const ACCESS_TECH_10MBPS:String = "10 Mbps Ethernet";
+ public static const ACCESS_TECH_45MBPS:String = "45 Mbps T3/DS3 subnet";
+ public static const ACCESS_TECH_100MBPS:String = "100 Mbps Ethernet";
+ public static const ACCESS_TECH_622MBPS:String = "622 Mbps OC-12";
+ public static const ACCESS_TECH_1GBPS:String = "1.0 Gbps Gigabit Ethernet";
+ public static const ACCESS_TECH_2GBPS:String = "2.4 Gbps OC-48";
+ public static const ACCESS_TECH_10GBPS:String = "10 Gigabit Ethernet/OC-192";
+
+ public static const ACCESS_TECH2LINK_SPEED:Object = {
+ ACCESS_TECH_UNKNOWN:NaN,
+ ACCESS_TECH_DIALUP:0.064, // 64 kbps
+ ACCESS_TECH_CABLEDSL:3, // 3 Mbps
+ ACCESS_TECH_10MBPS:10,
+ ACCESS_TECH_45MBPS:45,
+ ACCESS_TECH_100MBPS:100,
+ ACCESS_TECH_622MBPS:622,
+ ACCESS_TECH_1GBPS:1000,
+ ACCESS_TECH_2GBPS:2400,
+ ACCESS_TECH_10GBPS:10000
+ }
+
+ // Duplex indicators as defined by the NDT server.
+ public static const DUPLEX_OK_INDICATOR:int = 0;
+ public static const DUPLEX_NOK_INDICATOR:int = 1;
+ public static const DUPLEX_SWITCH_FULL_HOST_HALF:int = 2;
+ public static const DUPLEX_SWITCH_HALF_HOST_FULL:int = 3;
+ public static const DUPLEX_SWITCH_FULL_HOST_HALF_POSS:int = 4;
+ public static const DUPLEX_SWITCH_HALF_HOST_FULL_POSS:int = 5;
+ public static const DUPLEX_SWITCH_HALF_HOST_FULL_WARN:int = 7;
+
+ // Cable status.
+ public static const CABLE_STATUS_OK:int = 0;
+ public static const CABLE_STATUS_NOK:int = 1;
+
+ // Congestion status.
+ public static const CONGESTION_NONE:int = 0;
+ public static const CONGESTION_YES:int = 1;
+
+ // Values of TCP options.
+ public static const SACKENABLED_OFF:int = 0;
+ public static const NAGLEENABLED_OFF:int = 0;
+ public static const ECNENABLED_OFF:int = 0;
+ public static const TIMESTAMPSENABLED_OFF:int = 0;
+
+ // Speed difference to detect packet queueing.
+ public static const SPD_DIFF:Number = 0.1;
+
+ // Constants for unit convertions.
+ public static const SEC2MSEC:uint = 1000;
+ public static const KBITS2BITS:uint = 1024;
+ public static const BYTES2BITS:uint = 8;
+ public static const PERCENTAGE:uint = 100;
+
+ // HTML tags.
+ public static const HTML_LOCALE:String = "Locale";
+ public static const HTML_USERAGENT:String = "UserAgentString";
+ public static const HTML_SERVER_HOSTNAME:String = "ServerHostname";
+
+ // Names of NDT variables sent by the server.
+ public static const MSSSENT:String = "MSSSent";
+ public static const MSSRCVD:String = "MSSRcvd";
+ public static const ECNENABLED:String = "ECNEnabled";
+ public static const NAGLEENABLED:String = "NagleEnabled";
+ public static const SACKENABLED:String = "SACKEnabled";
+ public static const TIMESTAMPSENABLED:String = "TimestampsEnabled";
+ public static const WINSCALERCVD:String = "WinScaleRcvd";
+ public static const WINSCALESENT:String = "WinScaleSent";
+ public static const SUMRTT:String = "SumRTT";
+ public static const COUNTRTT:String = "CountRTT";
+ public static const CURMSS:String = "CurMSS";
+ public static const TIMEOUTS:String = "Timeouts";
+ public static const PKTSRETRANS:String = "PktsRetrans";
+ public static const SACKSRCVD:String = "SACKsRcvd";
+ public static const DUPACKSIN:String = "DupAcksIn";
+ public static const MAXRWINRCVD:String = "MaxRwinRcvd";
+ public static const MAXRWINSENT:String = "MaxRwinSent";
+ public static const SNDBUF:String = "Sndbuf";
+ public static const X_RCVBUF:String = "X_Rcvbuf";
+ public static const DATAPKTSOUT:String = "DataPktsOut";
+ public static const FASTRETRAN:String = "FastRetran";
+ public static const ACKPKTSOUT:String = "AckPktsOut";
+ public static const SMOOTHEDRTT:String = "SmoothedRTT";
+ public static const CURCWND:String = "CurCwnd";
+ public static const MAXCWND:String = "MaxCwnd";
+ public static const SNDLIMTIMERWIN:String = "SndLimTimeRwin";
+ public static const SNDLIMTIMECWND:String = "SndLimTimeCwnd";
+ public static const SNDLIMTIMESENDER:String = "SndLimTimeSender";
+ public static const DATABYTESOUT:String = "DataBytesOut";
+ public static const ACKPKTSIN:String = "AckPktsIn";
+ public static const SNDLIMTRANSRWIN:String = "SndLimTransRwin";
+ public static const SNDLIMTRANSCWND:String = "SndLimTransCwnd";
+ public static const SNDLIMTRANSSENDER:String = "SndLimTransSender";
+ public static const MAXSSTHRESH:String = "MaxSsthresh";
+ public static const CURRTO:String = "CurRTO";
+ public static const MAXRTO:String = "MaxRTO";
+ public static const MINRTO:String = "MinRTO";
+ public static const MINRTT:String = "MinRTT";
+ public static const MAXRTT:String = "MaxRTT";
+ public static const CURRWINRCVD:String = "CurRwinRcvd";
+ public static const C2SDATA:String = "c2sData";
+ public static const C2SACK:String = "c2sAck";
+ public static const S2CDATA:String = "s2cData";
+ public static const S2CACK:String = "s2cAck";
+ public static const PKTSOUT:String = "PktsOut";
+ public static const MISMATCH:String = "mismatch";
+ public static const CONGESTION:String = "congestion";
+ public static const BAD_CABLE:String = "bad_cable";
+ public static const HALF_DUPLEX:String = "half_duplex";
+ public static const CONGESTIONSIGNALS:String = "CongestionSignals";
+ public static const RCVWINSCALE:String = "RcvWinScale";
+ public static const BW:String = "bw";
+ public static const LOSS:String = "loss";
+ public static const AVGRTT:String = "avgrtt";
+ public static const WAITSEC:String = "waitsec";
+ public static const TIMESEC:String = "timesec";
+ public static const ORDER:String = "order";
+ public static const RWINTIME:String = "rwintime";
+ public static const SENDTIME:String = "sendtime";
+ public static const CWNDTIME:String = "cwndtime";
+ public static const RTTSEC:String = "rttsec";
+ public static const RWIN:String = "rwin";
+ public static const SWIN:String = "swin";
+ public static const CWIN:String = "cwin";
+ public static const SPD:String = "spd";
+ public static const ASPD:String = "aspd";
+ }
+}
+
=======================================
--- /dev/null
+++ /trunk/flash-client/src/NDTPController.as Sun Feb 2 19:14:17 2014 UTC
@@ -0,0 +1,252 @@
+// Copyright 2013 M-Lab
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package {
+ import flash.errors.IOError;
+ import flash.events.Event;
+ import flash.events.IOErrorEvent;
+ import flash.events.ProgressEvent;
+ import flash.events.SecurityErrorEvent;
+ import flash.events.TimerEvent;
+ import flash.net.Socket;
+ import flash.system.Security;
+ import flash.utils.Timer;
+ import mx.resources.ResourceManager;
+
+ /**
+ * This class creates (and closes) the Control socket with the server and
+ * coordinates the NDT protocol, which includes the initial handshake, all
+ * the measurement tests and the retrieval of the test results.
+ */
+ public class NDTPController {
+ private const READ_TIMEOUT:int = 10000; // 10sec
+ // Valid values for _testStage.
+ private const REMOTE_RESULTS1:int = 0;
+ private const REMOTE_RESULTS2:int = 1;
+
+ private var _ctlSocket:Socket = null;
+ private var _hostname:String;
+ private var _msg:Message;
+ private var _readResultsTimer:Timer;
+ private var _remoteTestResults:String;
+ private var _testsToRun:Array;
+ private var _testStage:int;
+
+ public function NDTPController(hostname:String) {
+ _hostname = hostname;
+
+ _remoteTestResults = ""
+ }
+
+ public function startNDTTest():void {
+ TestResults.recordStartTime();
+ TestResults.ndt_test_results::ndtTestFailed = false;
+ TestResults.appendDebugMsg(ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "connectingTo", null, Main.locale)
+ + " " + _hostname + " " + ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "toRunTest", null, Main.locale));
+
+ _ctlSocket = new Socket();
+ addSocketEventListeners();
+ try {
+ _ctlSocket.connect(_hostname, NDTConstants.DEFAULT_CONTROL_PORT);
+ } catch(e:IOError) {
+ TestResults.appendErrMsg("Control socket connect IO error: " + e);
+ failNDTTest();
+ } catch(e:SecurityError) {
+ TestResults.appendErrMsg("Control socket connect security error: " + e);
+ failNDTTest();
+ }
+ TestResults.appendDebugMsg( + ResourceManager.getInstance().getString( + NDTConstants.BUNDLE_NAME, "connected", null, Main.locale)
+ + " " + _hostname);
+ }
+
+ private function addSocketEventListeners():void {
+ _ctlSocket.addEventListener(Event.CONNECT, onConnect);
+ _ctlSocket.addEventListener(Event.CLOSE, onClose);
+ _ctlSocket.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
+ _ctlSocket.addEventListener(SecurityErrorEvent.SECURITY_ERROR,
+ onSecurityError);
+ }
+
+ private function onConnect(e:Event):void {
+ TestResults.appendDebugMsg("Control socket connected.");
+ startHandshake();
+ }
+
+ private function onClose(e:Event):void {
+ TestResults.appendDebugMsg("Control socket closed by server.");
+ }
+
+ private function onIOError(e:IOErrorEvent):void {
+ TestResults.appendErrMsg("IOError on Control socket: " + e);
+ failNDTTest();
+ }
+
+ private function onSecurityError(e:SecurityErrorEvent):void {
+ TestResults.appendErrMsg("Security error on Control socket: " + e);
+ failNDTTest();
+ }
+
+ private function startHandshake():void {
+ var handshake:Handshake = new Handshake(
+ _ctlSocket, NDTConstants.TESTS_REQUESTED_BY_CLIENT, this);
+ handshake.run();
+ }
+
+ public function initiateTests(testsConfirmedByServer:String):void {
+ _testsToRun = testsConfirmedByServer.split(" ");
+ runTests();
+ }
+
+ public function runTests():void {
+ if (_testsToRun.length > 0) {
+ var currentTest:int = parseInt(_testsToRun.shift());
+ switch (currentTest) {
+ case TestType.C2S:
+ var c2s:TestC2S = new TestC2S(_ctlSocket, _hostname, this);
+ c2s.run();
+ break;
+ case TestType.S2C:
+ var s2c:TestS2C = new TestS2C(_ctlSocket, _hostname, this);
+ s2c.run();
+ break;
+ case TestType.META:
+ var meta:TestMETA = new TestMETA(_ctlSocket, this);
+ meta.run();
+ break;
+ default:
+ TestResults.appendErrMsg(ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "unknownID", null, Main.locale));
+ failNDTTest();
+ }
+ } else {
+ addOnReceivedDataListener();
+ _msg = new Message();
+ _testStage = REMOTE_RESULTS1;
+ _readResultsTimer = new Timer(READ_TIMEOUT);
+ _readResultsTimer.addEventListener(TimerEvent.TIMER, onReadTimeout);
+ _readResultsTimer.start();
+ if (_ctlSocket.bytesAvailable > 0)
+ // In case data arrived before starting the onReceiveData listener.
+ getRemoteResults1();
+ }
+ }
+
+ private function addOnReceivedDataListener():void {
+ _ctlSocket.addEventListener(ProgressEvent.SOCKET_DATA, onReceivedData);
+ }
+
+ private function removeOnReceivedDataListener():void {
+ _ctlSocket.removeEventListener(ProgressEvent.SOCKET_DATA, onReceivedData);
+ }
+
+ private function onReceivedData(e:ProgressEvent):void {
+ switch (_testStage) {
+ case REMOTE_RESULTS1:
+ getRemoteResults1()
+ break;
+ case REMOTE_RESULTS2:
+ getRemoteResults2()
+ break;
+ }
+ }
+
+ private function onReadTimeout(e:TimerEvent):void {
+ _readResultsTimer.stop();
+ TestResults.appendErrMsg(ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "resultsTimeout", null, Main.locale));
+ failNDTTest();
+ }
+
+ private function getRemoteResults1():void {
+ if (!_msg.readHeader(_ctlSocket))
+ return;
+
+ if (_msg.type == MessageType.MSG_LOGOUT) {
+ // All results obtained.
+ _readResultsTimer.stop();
+ removeOnReceivedDataListener();
+ succeedNDTTest();
+ return;
+ }
+
+ _testStage = REMOTE_RESULTS2;
+ if (_ctlSocket.bytesAvailable > 0)
+ // In case header and body have arrive together at the client, they
+ // trigger a single ProgressEvent.SOCKET_DATA event. In such case, it's
+ // necessary to explicitly call the following function to move to the
+ // next step.
+ getRemoteResults2();
+ }
+
+ private function getRemoteResults2():void {
+ if (!_msg.readBody(_ctlSocket, _msg.length))
+ return;
+
+ if (_msg.type != MessageType.MSG_RESULTS) {
+ TestResults.appendErrMsg(ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "resultsWrongMessage", null,
+ Main.locale));
+ _readResultsTimer.stop();
+ removeOnReceivedDataListener();
+ failNDTTest();
+ return;
+ }
+
+ _remoteTestResults += new String(_msg.body);
+ _msg = new Message();
+ _testStage = REMOTE_RESULTS1;
+ if (_ctlSocket.bytesAvailable > 0)
+ // In case two consecutive MSG_RESULTS messages arrive together at the
+ // client they trigger a single ProgressEvent.SOCKET_DATA event. In such
+ // case, it's necessary to explicitly call the following function to
+ // move to the next step.
+ getRemoteResults1();
+ }
+
+ public function failNDTTest():void {
+ TestResults.ndt_test_results::ndtTestFailed = true;
+ NDTUtils.callExternalFunction("fatalErrorOccured");
+ TestResults.appendErrMsg("NDT test failed.");
+ finishNDTTest();
+ }
+
+ public function succeedNDTTest():void {
+ TestResults.ndt_test_results::ndtTestFailed = false;
+ NDTUtils.callExternalFunction("allTestsCompleted");
+ TestResults.appendDebugMsg("All the tests completed successfully.");
+ finishNDTTest();
+ }
+
+ private function finishNDTTest():void {
+ try {
+ } catch (e:IOError) {
+ TestResults.appendErrMsg(
+ "Client failed to close Control socket. Error" + e);
+ }
+
+ TestResults.recordEndTime();
+ TestResults.ndt_test_results::remoteTestResults += _remoteTestResults;
+
+ TestResults.interpretResults();
+ if (Main.guiEnabled) {
+ Main.gui.displayResults();
+ }
+ }
+ }
+}
+
=======================================
--- /dev/null
+++ /trunk/flash-client/src/NDTUtils.as Sun Feb 2 19:14:17 2014 UTC
@@ -0,0 +1,190 @@
+// Copyright 2013 M-Lab
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package {
+ import flash.errors.EOFError;
+ import flash.errors.IOError;
+ import flash.external.ExternalInterface;
+ import flash.globalization.LocaleID;
+ import flash.system.Capabilities;
+ import flash.system.Security;
+ import flash.net.Socket;
+ import flash.utils.ByteArray;
+ import mx.resources.ResourceManager;
+
+ public class NDTUtils {
+ /**
+ * Function that calls a JS function through the ExternalInterface class if
+ * it exists by the name specified in the parameter.
+ * @param {String} functionName The name of the JS function to call.
+ * @param {...} args A variable length array that contains the parameters to
+ * pass to the JS function
+ */
+ public static function callExternalFunction(
+ functionName:String, ... args):void {
+ if (!ExternalInterface.available)
+ return;
+ try {
+ switch (args.length) {
+ case 0: ExternalInterface.call(functionName);
+ break;
+ case 1: ExternalInterface.call(functionName, args[0]);
+ break;
+ case 2: ExternalInterface.call(functionName, args[0], args[1]);
+ break;
+ }
+ } catch (e:Error) {
+ // TODO(tiziana): Find out why ExternalInterface.available does not work
+ // in some cases and this exception is raised.
+ }
+ }
+ /**
+ * Function that reads the HTML parameter tags for the SWF file and
+ * initializes the variables in the SWF accordingly.
+ */
+ public static function initializeFromHTML(paramObject:Object):void {
+ if (NDTConstants.HTML_LOCALE in paramObject) {
+ Main.locale = paramObject[NDTConstants.HTML_LOCALE];
+ TestResults.appendDebugMsg("Initialized locale from HTML. Locale: "
+ + Main.locale);
+ } else {
+ initializeLocale();
+ }
+
+ if (NDTConstants.HTML_SERVER_HOSTNAME in paramObject) {
+ Main.server_hostname = paramObject[NDTConstants.HTML_SERVER_HOSTNAME];
+ TestResults.appendDebugMsg("Initialized server from HTML. Server: "
+ + Main.server_hostname);
+ }
+ // else keep the default value (NDTConstants.SERVER_HOSTNAME).
+
+ if (!ExternalInterface.available)
+ return;
+
+ try {
+ TestResults.ndt_test_results::userAgent = ExternalInterface.call(
+ "window.navigator.userAgent.toString");
+ TestResults.appendDebugMsg(
+ "Initialized useragent from JavaScript. Useragent:"
+ + TestResults.ndt_test_results::userAgent);
+ } catch(e:Error) {
+ // TODO(tiziana): Find out why ExternalInterface.available does not work
+ // in some cases and this exception is raised.
+ }
+
+ try {
+ Main.server_hostname = ExternalInterface.call("getNDTServer");
+ TestResults.appendDebugMsg(
+ "Initialized server from JavaScript. Server hostname:"
+ + Main.server_hostname);
+ } catch(e:Error) {
+ Main.server_hostname = NDTConstants.SERVER_HOSTNAME;
+ }
+ }
+
+ /**
+ * Initializes the locale used by the tool to match the environment of the
+ * SWF.
+ */
+ public static function initializeLocale():void {
+ var localeId:LocaleID = new LocaleID(Capabilities.language);
+ var lang:String = localeId.getLanguage();
+ var region:String = localeId.getRegion();
+ if (lang != null && region != null
+ && (ResourceManager.getInstance().getResourceBundle(
+ lang + "_" + region, NDTConstants.BUNDLE_NAME) != null)) {
+ // Bundle for specified locale found, change value of locale.
+ Main.locale = new String(lang + "_" + region);
+ TestResults.appendDebugMsg(
+ "Initialized locale from Flash config. Locale: " + Main.locale);
+ } else {
+ TestResults.appendDebugMsg(
+ "Not found ResourceBundle for locale requested in Flash config. " +
+ "Using default locale: " + CONFIG::defaultLocale);
+ }
+ }
+
+ /**
+ * Function that adds the callbacks to allow data access from, and to allow
+ * data to be sent to JavaScript.
+ */
+ public static function addJSCallbacks():void {
+ if (!ExternalInterface.available)
+ return;
+ // TODO(tiziana): Restrict domain to the M-Lab website/server.
+ Security.allowDomain("*");
+ try {
+ ExternalInterface.addCallback(
+ "getDebugOutput", TestResults.getDebugMsg);
+ ExternalInterface.addCallback(
+ "getDetails", TestResults.getResultDetails);
+ ExternalInterface.addCallback(
+ "getErrors", TestResults.getErrMsg);
+ ExternalInterface.addCallback(
+ "getNDTvar", TestResultsUtils.getNDTVariable);
+ } catch (e:Error) {
+ // TODO(tiziana): Find out why ExternalInterface.available does not work
+ // in some cases and this exception is raised.
+ } catch (e:SecurityError) {
+ TestResults.appendErrMsg("Security error when adding callbacks: " + e);
+ }
+ }
+
+ /**
+ * Reads bytes from a socket into a ByteArray and returns the number of
+ * successfully read bytes.
+ * @param {Socket} socket Socket object to read from.
+ * @param {ByteArray} bytes ByteArray where to store the read bytes.
+ * @param {uint} offset Position of the ByteArray from where to start
+ storing the read values.
+ * @param {uint} byteToRead Number of bytes to read.
+ * @return {int} Number of successfully read bytes.
+ */
+ public static function readBytes(socket:Socket, bytes:ByteArray,
+ offset:uint, bytesToRead:uint):int {
+ var bytesRead:int = 0;
+ while (socket.bytesAvailable && bytesRead < bytesToRead) {
+ try {
+ bytes[bytesRead + offset] = socket.readByte();
+ } catch (e:IOError) {
+ TestResults.appendErrMsg("Error reading byte from socket: " + e);
+ break;
+ } catch(error:EOFError) {
+ // No more data to read from the socket.
+ break;
+ }
+ bytesRead++;
+ }
+ return bytesRead;
+ }
+
+ public static function readAllBytesAndDiscard(socket:Socket):int {
+ var bytesCount:int = 0;
+ while (socket.bytesAvailable) {
+ try {
+ socket.readByte();
+ bytesCount++;
+ } catch (e:IOError) {
+ TestResults.appendErrMsg("Error reading byte from socket: " + e);
+ break;
+ } catch(error:EOFError) {
+ // No more data to read from the socket.
+ break;
+ }
+ }
+ return bytesCount;
+ }
+ }
+}
+
=======================================
--- /dev/null
+++ /trunk/flash-client/src/TestC2S.as Sun Feb 2 19:14:17 2014 UTC
@@ -0,0 +1,441 @@
+// Copyright 2013 M-Lab
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package {
+ import flash.errors.IOError;
+ import flash.events.Event;
+ import flash.events.IOErrorEvent;
+ import flash.events.OutputProgressEvent;
+ import flash.events.ProgressEvent;
+ import flash.events.SecurityErrorEvent;
+ import flash.events.TimerEvent;
+ import flash.net.Socket;
+ import flash.utils.ByteArray;
+ import flash.utils.getTimer;
+ import flash.utils.Timer;
+ import mx.resources.ResourceManager;
+
+ /**
+ * This class performs the Client-to-Server throughput test.
+ */
+ public class TestC2S {
+ // Valid values for _testStage.
+ private static const PREPARE_TEST1:int = 0;
+ private static const PREPARE_TEST2:int = 1;
+ private static const START_TEST:int = 2;
+ private static const SEND_DATA:int = 3;
+ private static const COMPUTE_THROUGHPUT:int = 4;
+ private static const COMPARE_SERVER1:int = 5;
+ private static const COMPARE_SERVER2:int = 6;
+ private static const FINALIZE_TEST:int = 7;
+ private static const END_TEST:int = 8;
+
+ private var _callerObj:NDTPController;
+ private var _c2sTestSuccess:Boolean;
+ // Time to send data to server on the C2S socket.
+ private var _c2sTestDuration:Number;
+ private var _ctlSocket:Socket;
+ private var _c2sSocket:Socket;
+ private var _c2sSendCount:int;
+ // Bytes not sent from last send operation on the C2S socket.
+ private var _c2sBytesNotSent:int;
+ private var _c2sTimer:Timer;
+ private var _dataToSend:ByteArray;
+ private var _msg:Message;
+ private var _serverHostname:String;
+ private var _testStage:int;
+
+ public function TestC2S(ctlSocket:Socket, serverHostname:String,
+ callerObj:NDTPController) {
+ _callerObj = callerObj;
+ _ctlSocket = ctlSocket;
+ _serverHostname = serverHostname;
+
+ _c2sTestSuccess = true; // Initially the test has not failed.
+ _c2sTestDuration = 0;
+ _dataToSend = new ByteArray();
+ _c2sSendCount = 0;
+ _c2sBytesNotSent = 0;
+ }
+
+ public function run():void {
+ TestResults.appendDebugMsg(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "startingTest", null, Main.locale) +
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "c2sThroughput", null, Main.locale));
+ NDTUtils.callExternalFunction("testStarted", "ClientToServerThroughput");
+ TestResults.appendDebugMsg("C2S test: PREPARE_TEST stage.");
+ TestResults.appendDebugMsg(ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "runningOutboundTest", null,
+ Main.locale));
+ TestResults.ndt_test_results::ndtTestStatus = "runningOutboundTest";
+
+ addCtlSocketOnReceivedDataListener();
+ _msg = new Message();
+ _testStage = PREPARE_TEST1;
+ if (_ctlSocket.bytesAvailable > 0)
+ // In case data arrived before starting the ProgressEvent.SOCKET_DATA
+ // listener.
+ prepareTest1();
+ }
+
+ private function addCtlSocketOnReceivedDataListener():void {
+ _ctlSocket.addEventListener(ProgressEvent.SOCKET_DATA, onCtlReceivedData);
+ }
+
+ private function removeCtlSocketOnReceivedDataListener():void {
+ _ctlSocket.removeEventListener(ProgressEvent.SOCKET_DATA,
+ onCtlReceivedData);
+ }
+
+ private function onCtlReceivedData(e:ProgressEvent):void {
+ switch (_testStage) {
+ case PREPARE_TEST1: prepareTest1();
+ break;
+ case PREPARE_TEST2: prepareTest2();
+ break;
+ case START_TEST: startTest();
+ break;
+ case COMPARE_SERVER1: compareWithServer1();
+ break;
+ case COMPARE_SERVER2: compareWithServer2();
+ break;
+ case FINALIZE_TEST: finalizeTest();
+ break;
+ case END_TEST: endTest();
+ break;
+ }
+ }
+
+ private function prepareTest1():void {
+ if (!_msg.readHeader(_ctlSocket))
+ return;
+
+ _testStage = PREPARE_TEST2;
+ if (_ctlSocket.bytesAvailable > 0)
+ // In case header and body have arrive together at the client, they
+ // trigger a single ProgressEvent.SOCKET_DATA event. In such case, it's
+ // necessary to explicitly call the following function to move to the
+ // next step.
+ prepareTest2();
+ }
+
+ private function prepareTest2():void {
+ if (!_msg.readBody(_ctlSocket, _msg.length))
+ return;
+
+ if (_msg.type != MessageType.TEST_PREPARE) {
+ TestResults.appendErrMsg(ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "outboundWrongMessage",null,
+ Main.locale));
+ if (_msg.type == MessageType.MSG_ERROR) {
+ TestResults.appendErrMsg(
+ "ERROR MSG: " + parseInt(new String(_msg.body), 16));
+ }
+ _c2sTestSuccess = false;
+ endTest();
+ return;
+ }
+
+ // Prepare the data to send to the server.
+ for (var i:int = 0; i < NDTConstants.PREDEFINED_BUFFER_SIZE; i++) {
+ _dataToSend.writeByte(i);
+ }
+ TestResults.appendDebugMsg(
+ "Each message of the C2S test has " + _dataToSend.length + " bytes.");
+
+ var c2sPort:int = parseInt(new String(_msg.body));
+ _c2sSocket = new Socket();
+ addC2SSocketEventListeners();
+ try {
+ _c2sSocket.connect(_serverHostname, c2sPort);
+ } catch(e:IOError) {
+ TestResults.appendErrMsg("C2S socket connect IO error: " + e);
+ _c2sTestSuccess = false;
+ endTest();
+ return;
+ } catch(e:SecurityError) {
+ TestResults.appendErrMsg("C2S socket connect security error: " + e);
+ _c2sTestSuccess = false;
+ endTest();
+ return;
+ }
+
+ _c2sTimer = new Timer(NDTConstants.C2S_DURATION);
+ _c2sTimer.addEventListener(TimerEvent.TIMER, onC2STimeout);
+ _msg = new Message();
+ _testStage = START_TEST;
+ TestResults.appendDebugMsg("C2S test: START_TEST stage.");
+
+ if (_ctlSocket.bytesAvailable > 0)
+ // If TEST_PREPARE and TEST_START messages arrive together at the client
+ // they trigger a single ProgressEvent.SOCKET_DATA event. In such case,
+ // it's necessary to explicitly call the following function to move to
+ // the next step.
+ startTest();
+ }
+
+ private function addC2SSocketEventListeners():void {
+ _c2sSocket.addEventListener(Event.CONNECT, onC2SConnect);
+ _c2sSocket.addEventListener(Event.CLOSE, onC2SClose);
+ _c2sSocket.addEventListener(IOErrorEvent.IO_ERROR, onC2SIOError);
+ _c2sSocket.addEventListener(SecurityErrorEvent.SECURITY_ERROR,
+ onC2SSecError);
+ _c2sSocket.addEventListener(OutputProgressEvent.OUTPUT_PROGRESS,
+ onC2SProgress);
+ }
+
+ private function removeC2SSocketEventListeners():void {
+ _c2sSocket.removeEventListener(Event.CONNECT, onC2SConnect);
+ _c2sSocket.removeEventListener(Event.CLOSE, onC2SClose);
+ _c2sSocket.removeEventListener(IOErrorEvent.IO_ERROR, onC2SIOError);
+ _c2sSocket.removeEventListener(SecurityErrorEvent.SECURITY_ERROR,
+ onC2SSecError);
+ _c2sSocket.removeEventListener(OutputProgressEvent.OUTPUT_PROGRESS,
+ onC2SProgress);
+ }
+
+ private function onC2SConnect(e:Event):void {
+ TestResults.appendDebugMsg("C2S socket connected.");
+ }
+
+ private function onC2SClose(e:Event):void {
+ TestResults.appendDebugMsg("C2S socket closed by the server.");
+ closeC2SSocket();
+ }
+
+ private function onC2SIOError(e:IOErrorEvent):void {
+ TestResults.appendErrMsg("IOError on C2S socket: " + e);
+ _c2sTestSuccess = false;
+ closeC2SSocket();
+ endTest();
+ }
+
+ private function onC2SSecError(e:SecurityErrorEvent):void {
+ TestResults.appendErrMsg("Security error on C2S socket: " + e);
+ _c2sTestSuccess = false;
+ closeC2SSocket();
+ endTest();
+ }
+
+ private function onC2SProgress(e:OutputProgressEvent):void {
+ if (_c2sSocket.bytesPending == 0)
+ _c2sSendCount++;
+ if (_c2sSocket.connected) {
+ sendData();
+ } else {
+ closeC2SSocket();
+ }
+ }
+
+ private function onC2STimeout(e:TimerEvent):void {
+ TestResults.appendDebugMsg("Timeout for sending data on C2S socket.");
+ closeC2SSocket();
+ }
+
+ private function startTest():void {
+ if (!_msg.readHeader(_ctlSocket))
+ return;
+ // TEST_START message has no body.
+
+ if (_msg.type != MessageType.TEST_START) {
+ TestResults.appendErrMsg(ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "outboundWrongMessage", null,
+ Main.locale));
+ if (_msg.type == MessageType.MSG_ERROR) {
+ TestResults.appendErrMsg("ERROR MSG: ");
+ }
+ _c2sTestSuccess = false;
+ endTest();
+ return;
+ }
+
+ // Remove ctl socket listener so it does not interfere with C2S socket
+ // listeners.
+ removeCtlSocketOnReceivedDataListener();
+
+ _c2sTimer.start();
+ // Record start time right before it starts sending data, to be as
+ // accurate as possible.
+ _c2sTestDuration = getTimer();
+
+ _testStage = SEND_DATA;
+ TestResults.appendDebugMsg("C2S test: SEND_DATA stage.");
+ sendData();
+ }
+
+ /**
+ * Function that is called repeatedly to send data to the server through the
+ * C2S socket.
+ */
+ private function sendData():void {
+ _c2sSocket.writeBytes(_dataToSend, 0, _dataToSend.length);
+ _c2sSocket.flush();
+ }
+
+ private function closeC2SSocket():void {
+ // Record end time right after it stops sending data, to be as accurate as
+ // possible.
+ _c2sTestDuration = getTimer() - _c2sTestDuration;
+ TestResults.appendDebugMsg(
+ "C2S test lasted " + _c2sTestDuration + " msec.");
+ _c2sTimer.stop();
+ _c2sTimer.removeEventListener(TimerEvent.TIMER, onC2STimeout);
+
+ if (_c2sSocket.connected)
+ _c2sBytesNotSent = _c2sSocket.bytesPending;
+
+ removeC2SSocketEventListeners();
+ try {
+ _c2sSocket.close();
+ } catch (e:IOError) {
+ TestResults.appendErrMsg(
+ "IO Error while closing C2S socket: " + e);
+ }
+ addCtlSocketOnReceivedDataListener();
+
+ _testStage = COMPUTE_THROUGHPUT;
+ calculateThroughput();
+ }
+
+ private function calculateThroughput():void {
+ TestResults.appendDebugMsg("C2S test: COMPUTE_THROUGHPUT stage.");
+
+ var c2sByteSent:Number = (
+ _c2sSendCount * NDTConstants.PREDEFINED_BUFFER_SIZE
+ + (NDTConstants.PREDEFINED_BUFFER_SIZE - _c2sBytesNotSent));
+ TestResults.appendDebugMsg("C2S test sent " + c2sByteSent + " bytes.");
+
+ var c2sSpeed:Number = (
+ (c2sByteSent * NDTConstants.BYTES2BITS)
+ / _c2sTestDuration);
+ TestResults.ndt_test_results::c2sSpeed = c2sSpeed;
+ TestResults.appendDebugMsg("C2S throughput computed by client is "
+ + c2sSpeed.toFixed(2) + " kbps.");
+
+ _msg = new Message();
+ _testStage = COMPARE_SERVER1;
+ TestResults.appendDebugMsg("C2S test: COMPARE_SERVER stage.");
+
+ // The following check is probably not necessary. Added anyway, in case
+ // the COMPARE_SERVER message does not trigger onReceivedData.
+ if (_ctlSocket.bytesAvailable > 0)
+ compareWithServer1();
+ }
+
+ private function compareWithServer1():void {
+ if (!_msg.readHeader(_ctlSocket))
+ return;
+
+ _testStage = COMPARE_SERVER2;
+ if (_ctlSocket.bytesAvailable > 0)
+ // In case header and body have arrive together at the client, they
+ // trigger a single ProgressEvent.SOCKET_DATA event. In such case,
+ // it's necessary to explicitly call the following function to move to
+ // the next step.
+ compareWithServer2();
+ }
+
+ private function compareWithServer2():void {
+ if (!_msg.readBody(_ctlSocket, _msg.length))
+ return;
+
+ if (_msg.type != MessageType.TEST_MSG) {
+ TestResults.appendErrMsg(ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "outboundWrongMessage", null,
+ Main.locale));
+ if(_msg.type == MessageType.MSG_ERROR) {
+ TestResults.appendErrMsg("ERROR MSG: "
+ + parseInt(new String(_msg.body), 16));
+ }
+ _c2sTestSuccess = false;
+ endTest();
+ return;
+ }
+
+ var sc2sSpeedStr:String = new String(_msg.body);
+ var sc2sSpeed:Number = parseFloat(sc2sSpeedStr);
+ if (isNaN(sc2sSpeed)) {
+ TestResults.appendErrMsg(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "outboundWrongMessage", null,
+ Main.locale)
+ + "Message received: " + sc2sSpeedStr);
+ _c2sTestSuccess = false;
+ endTest();
+ return;
+ }
+
+ TestResults.ndt_test_results::sc2sSpeed = sc2sSpeed;
+ TestResults.appendDebugMsg("C2S throughput computed by the server is "
+ + sc2sSpeed.toFixed(2) + " kbps");
+
+ _msg = new Message();
+ _testStage = FINALIZE_TEST;
+ TestResults.appendDebugMsg("C2S test: FINALIZE_TEST stage.");
+ if(_ctlSocket.bytesAvailable > 0)
+ // If COMPARE_SERVER and TEST_FINALIZE messages arrive together at the
+ // client, they trigger a single ProgressEvent.SOCKET_DATA event. In
+ // such case, it's necessary to explicitly call the following function
+ // to move to the next step.
+ finalizeTest();
+ }
+
+ private function finalizeTest():void {
+ if (!_msg.readHeader(_ctlSocket))
+ return;
+ // TEST_FINALIZE message has no body.
+
+ if (_msg.type != MessageType.TEST_FINALIZE) {
+ TestResults.appendErrMsg(ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "outboundWrongMessage", null,
+ Main.locale));
+ if (_msg.type == MessageType.MSG_ERROR) {
+ TestResults.appendErrMsg("ERROR MSG");
+ }
+ _c2sTestSuccess = false;
+ endTest();
+ return;
+ }
+
+ _c2sTestSuccess = true;
+ endTest();
+ return;
+ }
+
+ private function endTest():void {
+ TestResults.appendDebugMsg("C2S test: END_TEST stage.");
+ removeCtlSocketOnReceivedDataListener();
+
+ if (_c2sTestSuccess)
+ TestResults.appendDebugMsg(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "c2sThroughput", null, Main.locale)
+ + " test " + ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "done", null, Main.locale));
+ else
+ TestResults.appendDebugMsg(ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "c2sThroughputFailed", null,
+ Main.locale));
+ TestResults.ndt_test_results::c2sTestSuccess = _c2sTestSuccess;
+ TestResults.ndt_test_results::ndtTestStatus = "done";
+ NDTUtils.callExternalFunction("testCompleted", "ClientToServerThroughput",
+ (!_c2sTestSuccess).toString());
+
+ _callerObj.runTests();
+ }
+ }
+}
+
=======================================
--- /dev/null
+++ /trunk/flash-client/src/TestMETA.as Sun Feb 2 19:14:17 2014 UTC
@@ -0,0 +1,258 @@
+// Copyright 2013 M-Lab
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package {
+
+ import flash.net.Socket;
+ import flash.events.ProgressEvent;
+ import flash.utils.ByteArray;
+ import flash.system.Capabilities;
+ import mx.resources.ResourceManager;
+
+ /**
+ * This class performs the META test.
+ */
+ public class TestMETA {
+ // Valid values for _testStage.
+ private static const PREPARE_TEST1:int = 0;
+ private static const PREPARE_TEST2:int = 1;
+ private static const START_TEST:int = 2;
+ private static const SEND_DATA:int = 3;
+ private static const FINALIZE_TEST:int = 4;
+ private static const END_TEST:int = 5;
+
+ private var _callerObj:NDTPController;
+ private var _ctlSocket:Socket;
+ private var _metaTestSuccess:Boolean;
+ private var _msg:Message;
+ private var _testStage:int;
+
+ public function TestMETA(ctlSocket:Socket, callerObject:NDTPController) {
+ _callerObj = callerObject;
+ _ctlSocket = ctlSocket;
+
+ _metaTestSuccess = true; // Initially the test has not failed.
+ }
+
+ public function run():void {
+ TestResults.appendDebugMsg(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "startingTest", null, Main.locale) +
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "meta", null, Main.locale));
+ NDTUtils.callExternalFunction("testStarted", "Meta");
+ TestResults.appendDebugMsg("META test: PREPARE_TEST stage.");
+ TestResults.appendDebugMsg(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "sendingMetaInformation", null,
+ Main.locale));
+ TestResults.ndt_test_results::ndtTestStatus = "sendingMetaInformation";
+
+ addOnReceivedDataListener();
+ _msg = new Message();
+ _testStage = PREPARE_TEST1;
+ if(_ctlSocket.bytesAvailable > 0)
+ // In case data arrived before starting the ProgressEvent.SOCKET_DATA
+ // listener.
+ prepareTest1();
+ }
+
+ private function addOnReceivedDataListener():void {
+ _ctlSocket.addEventListener(ProgressEvent.SOCKET_DATA, onReceivedData);
+ }
+
+ private function removeResponseListener():void {
+ _ctlSocket.removeEventListener(ProgressEvent.SOCKET_DATA, onReceivedData);
+ }
+
+ private function onReceivedData(e:ProgressEvent):void {
+ switch (_testStage) {
+ case PREPARE_TEST1: prepareTest1();
+ break;
+ case PREPARE_TEST2: prepareTest2();
+ break;
+ case START_TEST: startTest();
+ break;
+ case FINALIZE_TEST: finalizeTest();
+ break;
+ case END_TEST: endTest();
+ break;
+ }
+ }
+
+ private function prepareTest1():void {
+ if (!_msg.readHeader(_ctlSocket))
+ return;
+
+ _testStage = PREPARE_TEST2;
+ if (_ctlSocket.bytesAvailable > 0)
+ // In case header and body have arrive together at the client, they
+ // trigger a single ProgressEvent.SOCKET_DATA event. In such case, it's
+ // necessary to explicitly call the following function to move to the
+ // next step.
+ prepareTest2();
+ }
+
+ private function prepareTest2():void {
+ if (!_msg.readBody(_ctlSocket, _msg.length))
+ return;
+
+ if (_msg.type != MessageType.TEST_PREPARE) {
+ TestResults.appendErrMsg(ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "metaWrongMessage", null, Main.locale));
+ if (_msg.type == MessageType.MSG_ERROR) {
+ TestResults.appendErrMsg("ERROR MSG: "
+ + parseInt(new String(_msg.body), 16));
+ }
+ _metaTestSuccess = false;
+ endTest();
+ return;
+ }
+
+ _msg = new Message();
+ _testStage = START_TEST;
+ TestResults.appendDebugMsg("META test: START_TEST stage.");
+
+ if (_ctlSocket.bytesAvailable > 0)
+ // If TEST_PREPARE and TEST_START messages arrive together at the client
+ // they trigger a single ProgressEvent.SOCKET_DATA event. In such case,
+ // it's necessary to explicitly call the following function to move to
+ // the next step.
+ startTest();
+ }
+
+ private function startTest():void {
+ if (!_msg.readHeader(_ctlSocket))
+ return;
+ // TEST_START message has no body.
+
+ if (_msg.type != MessageType.TEST_START) {
+ TestResults.appendErrMsg(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "metaWrongMessage", null,
+ Main.locale));
+ if (_msg.type == MessageType.MSG_ERROR) {
+ TestResults.appendErrMsg(
+ "ERROR MSG: " + parseInt(new String(_msg.body), 16));
+ }
+ _metaTestSuccess = false;
+ endTest();
+ return;
+ }
+
+ _testStage = SEND_DATA;
+ TestResults.appendDebugMsg("META test: SEND_DATA stage.");
+ sendData();
+ }
+
+ private function sendData():void {
+ var bodyToSend:ByteArray = new ByteArray();
+
+ bodyToSend.writeUTFBytes(new String(
+ NDTConstants.META_CLIENT_OS + ":" + Capabilities.os));
+ var _msg:Message = new Message(MessageType.TEST_MSG, bodyToSend);
+ if (!_msg.sendMessage(_ctlSocket)) {
+ _metaTestSuccess = false;
+ endTest();
+ return;
+ }
+
+ bodyToSend.clear();
+ bodyToSend.writeUTFBytes(new String(
+ NDTConstants.META_CLIENT_BROWSER + ":" + UserAgentTools.getBrowser(
+ TestResults.ndt_test_results::userAgent)[2]));
+ _msg = new Message(MessageType.TEST_MSG, bodyToSend);
+ if (!_msg.sendMessage(_ctlSocket)) {
+ _metaTestSuccess = false;
+ endTest();
+ return;
+ }
+
+ bodyToSend.clear();
+ bodyToSend.writeUTFBytes(new String(
+ NDTConstants.META_CLIENT_VERSION + ":"
+ + NDTConstants.CLIENT_VERSION));
+ _msg = new Message(MessageType.TEST_MSG, bodyToSend);
+ if (!_msg.sendMessage(_ctlSocket)) {
+ _metaTestSuccess = false;
+ endTest();
+ return;
+ }
+
+ bodyToSend.clear();
+ bodyToSend.writeUTFBytes(new String(
+ NDTConstants.META_CLIENT_APPLICATION + ":" + NDTConstants.CLIENT_ID));
+
+ // Client can send any number of such meta data in a TEST_MSG format and
+ // signal the send of the transmission using an empty TEST_MSG.
+ _msg = new Message(MessageType.TEST_MSG, new ByteArray());
+ if (!_msg.sendMessage(_ctlSocket)) {
+ _metaTestSuccess = false;
+ endTest();
+ return;
+ }
+
+ _testStage = FINALIZE_TEST;
+ TestResults.appendDebugMsg("META test: FINALIZE_TEST stage.");
+ // The following check is probably not necessary. Added anyway, in case
+ // the TEST_FINALIZE message does not trigger onReceivedData.
+ if (_ctlSocket.bytesAvailable > 0)
+ finalizeTest();
+ }
+
+ private function finalizeTest():void {
+ if (!_msg.readHeader(_ctlSocket))
+ return;
+ // TEST_FINALIZE message has no body.
+
+ if (_msg.type != MessageType.TEST_FINALIZE) {
+ TestResults.appendErrMsg(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME,"metaWrongMessage", null,
+ Main.locale));
+ if (_msg.type == MessageType.MSG_ERROR) {
+ TestResults.appendErrMsg("ERROR MSG");
+ }
+ _metaTestSuccess = false;
+ endTest();
+ return;
+ }
+ _metaTestSuccess = true;
+ endTest();
+ return;
+ }
+
+ private function endTest():void {
+ TestResults.appendDebugMsg("META test: END_TEST stage.");
+ removeResponseListener();
+
+ if (_metaTestSuccess)
+ TestResults.appendDebugMsg(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "meta", null, Main.locale)
+ + " test " + ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "done", null, Main.locale));
+ else
+ TestResults.appendDebugMsg(ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "metaFailed", null, Main.locale));
+
+ TestResults.ndt_test_results::ndtTestStatus = "done";
+ NDTUtils.callExternalFunction(
+ "testCompleted", "Meta", (!_metaTestSuccess).toString());
+
+ _callerObj.runTests();
+ }
+ }
+}
+
=======================================
--- /dev/null
+++ /trunk/flash-client/src/TestResults.as Sun Feb 2 19:14:17 2014 UTC
@@ -0,0 +1,147 @@
+// Copyright 2013 M-Lab
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package {
+ use namespace ndt_test_results;
+ import flash.utils.getTimer;
+ import mx.resources.ResourceManager;
+ /**
+ * Class used throughout the test to store test results along with debug and
+ * error messages. It also interprets the results of the tests. The results
+ * are stored in variables that can be accessed through JavaScript.
+ */
+ public class TestResults {
+ private static var _ndtTestStartTime:Number = 0.0;
+ private static var _ndtTestEndTime:Number = 0.0;
+ private static var _resultDetails:String = "";
+ private static var _errMsg:String = "";
+ private static var _debugMsg:String = "";
+
+ // Variables accessed by other classes to get and/or set values.
+ ndt_test_results static var accessTech:String = null;
+ ndt_test_results static var linkSpeed:Number = 0.0;
+ ndt_test_results static var ndtVariables:Object = new Object();
+ ndt_test_results static var userAgent:String;
+ // Valid only when ndtTestFailed == false.
+ ndt_test_results static var ndtTestStatus:String = null;
+ ndt_test_results static var ndtTestFailed:Boolean = false;
+ ndt_test_results static var c2sSpeed:Number = 0.0;
+ ndt_test_results static var s2cSpeed:Number = 0.0;
+ ndt_test_results static var sc2sSpeed:Number = 0.0;
+ ndt_test_results static var ss2cSpeed:Number = 0.0;
+ ndt_test_results static var c2sTestSuccess:Boolean;
+ ndt_test_results static var s2cTestSuccess:Boolean;
+ ndt_test_results static var s2cTestResults:String;
+ // Results sent by the server.
+ ndt_test_results static var remoteTestResults:String = "";
+ ndt_test_results static var testsConfirmedByServer:int;
+
+ public static function get jitter():Number {
+ return ndtVariables[NDTConstants.MAXRTT] -
+ ndtVariables[NDTConstants.MINRTT];
+ }
+
+ public static function get duration():Number {
+ return _ndtTestEndTime - _ndtTestStartTime;
+ }
+
+ public static function get testList():String {
+ var testSuite:String = "";
+ if(testsConfirmedByServer & TestType.C2S)
+ testSuite += "CLIENT_TO_SERVER_THROUGHPUT\n";
+ if(testsConfirmedByServer & TestType.S2C)
+ testSuite += "SERVER_TO_CLIENT_THROUGHPUT\n";
+ if(testsConfirmedByServer & TestType.META)
+ testSuite += "META_TEST\n";
+ return testSuite;
+ }
+
+ public static function recordStartTime():void {
+ _ndtTestStartTime = getTimer();
+ }
+
+ public static function recordEndTime():void {
+ _ndtTestEndTime = getTimer();
+ }
+
+ public static function appendResultDetails(results:String):void {
+ _resultDetails += results + "\n";
+ }
+
+ public static function appendErrMsg(msg:String):void {
+ _errMsg += msg + "\n";
+ NDTUtils.callExternalFunction("appendErrors", msg);
+ appendDebugMsg(msg);
+ }
+
+ public static function appendDebugMsg(msg:String):void {
+ if (!CONFIG::debug) {
+ return;
+ }
+ var formattedMsg:String = (new Date().toUTCString()) + ": " + msg + "\n";
+ _debugMsg += formattedMsg;
+ NDTUtils.callExternalFunction("appendDebugOutput", msg);
+ // _ndtTestStartTime > 0 ensures the console window has been created.
+ // TODO(tiziana): Verify if there is cleaner alternative.
+ if (Main.guiEnabled && _ndtTestStartTime > 0)
+ // TODO(tiziana): Handle the communication with GUI via events, instead
+ // of blocking calls.
+ Main.gui.addConsoleOutput(formattedMsg);
+ }
+
+ public static function getDebugMsg():String {
+ return _debugMsg;
+ }
+
+ public static function getResultDetails():String {
+ return _resultDetails;
+ }
+
+ public static function getErrMsg():String {
+ if (_errMsg == "")
+ return "No errors!";
+ else
+ return _errMsg;
+ }
+
+ public static function interpretResults():void {
+ TestResultsUtils.parseNDTVariables(s2cTestResults + remoteTestResults);
+ TestResultsUtils.appendClientInfo();
+ if (ndtVariables[NDTConstants.COUNTRTT] > 0) {
+ TestResultsUtils.getAccessLinkSpeed();
+ TestResultsUtils.appendDuplexMismatchResults();
+ if ((testsConfirmedByServer & TestType.C2S) == TestType.C2S)
+ TestResultsUtils.appendC2SPacketQueueingResults();
+ if ((testsConfirmedByServer & TestType.S2C) == TestType.S2C)
+ TestResultsUtils.appendC2SPacketQueueingResults();
+ TestResultsUtils.appendBottleneckResults();
+ // TODO(tiziana): Verify overlap with getAccessLinkSpeed.
+ TestResultsUtils.appendDataRateResults();
+ // TODO(tiziana): Verify overlap with appendDuplexMismatchResult.
+ TestResultsUtils.appendDuplexCongestionMismatchResults();
+ TestResultsUtils.appendAvgRTTAndPAcketSizeResults();
+ TestResultsUtils.appendPacketRetrasmissionResults();
+ // TODO(tiziana): Verify overlap with appendC2SPacketQueueingResult and
+ // appendC2SPacketQueueingResult.
+ TestResultsUtils.appendPacketQueueingResults(testsConfirmedByServer);
+ TestResultsUtils.appendTCPNegotiatedOptions();
+ TestResultsUtils.appendThroughputLimitResults();
+ NDTUtils.callExternalFunction("resultsProcessed");
+ }
+ TestResults.appendResultDetails("=== Results sent by the server ===");
+ TestResults.appendResultDetails(s2cTestResults + remoteTestResults);
+ // TODO(tiziana): If parsing mistake, log message "resultsParseError".
+ }
+ }
+}
=======================================
--- /dev/null
+++ /trunk/flash-client/src/TestResultsUtils.as Sun Feb 2 19:14:17 2014 UTC
@@ -0,0 +1,819 @@
+// Copyright 2013 M-Lab
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package {
+ use namespace ndt_test_results;
+ import flash.system.Capabilities;
+ import mx.resources.ResourceManager;
+ import mx.utils.StringUtil;
+
+ public class TestResultsUtils {
+ /**
+ * Return text representation of data speed values.
+ */
+ public static function getDataRateString(dataRateInt:int):String {
+ switch (dataRateInt) {
+ case NDTConstants.DATA_RATE_SYSTEM_FAULT:
+ return ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "systemFault", null, Main.locale);
+ case NDTConstants.DATA_RATE_RTT:
+ return ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "rtt", null, Main.locale);
+ case NDTConstants.DATA_RATE_DIAL_UP:
+ return ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "dialup2", null, Main.locale);
+ case NDTConstants.DATA_RATE_T1:
+ return ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "t1Str", null, Main.locale);
+ case NDTConstants.DATA_RATE_ETHERNET:
+ return ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "ethernetStr", null, Main.locale);
+ case NDTConstants.DATA_RATE_T3:
+ return ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "t3Str", null, Main.locale);
+ case NDTConstants.DATA_RATE_FAST_ETHERNET:
+ return ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "fastEthernet", null, Main.locale);
+ case NDTConstants.DATA_RATE_OC_12:
+ return ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "oc12Str", null, Main.locale);
+ case NDTConstants.DATA_RATE_GIGABIT_ETHERNET:
+ return ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "gigabitEthernetStr", null, Main.locale);
+ case NDTConstants.DATA_RATE_OC_48:
+ return ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "oc48Str", null, Main.locale);
+ case NDTConstants.DATA_RATE_10G_ETHERNET:
+ return ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "tengigabitEthernetStr", null,
+ Main.locale);
+ }
+ return null;
+ }
+
+ /**
+ * Function that return a variable corresponding to the parameter passed to
+ * it as a request.
+ * @param {String} The parameter which the caller is seeking.
+ * @return {String} The value of the desired parameter.
+ */
+ public static function getNDTVariable(varName:String):String {
+ switch(varName) {
+ case "TestList":
+ return TestResults.testList;
+ case "TestDuration":
+ return TestResults.duration.toString();
+ case "ClientToServerSpeed":
+ return TestResults.ndt_test_results::c2sSpeed.toString();
+ case "ServerToClientSpeed":
+ return TestResults.ndt_test_results::s2cSpeed.toString();
+ case "Jitter":
+ return TestResults.jitter.toString();
+ case "OperatingSystem":
+ return Capabilities.os;
+ case "ClientVersion":
+ return NDTConstants.CLIENT_VERSION;
+ case "FlashVersion":
+ return Capabilities.version;
+ case "OsArchitecture":
+ return Capabilities.cpuArchitecture;
+ }
+ if (varName in TestResults.ndtVariables) {
+ return TestResults.ndtVariables[varName].toString();
+ }
+ return null;
+ }
+
+ public static function parseNDTVariables(testResults:String):void {
+ // Extract the key-value pairs.
+ var pairs:Array = StringUtil.trim(testResults).split(/\s/);
+ var i:int;
+ var varName:String;
+ var varValue:String;
+ var intValue:int;
+ var floatValue:Number;
+ for (i = 0; i < pairs.length; i = i + 2) {
+ // Strips ":" from the web100 variable name.
+ varName = pairs[i].split(":")[0];
+ varValue = pairs[i + 1];
+ // Figure out if varValue is integer or float.
+ // 1) Try integer.
+ intValue = parseInt(varValue);
+ if (varValue == String(intValue)) {
+ // Yes, it's a valid integer.
+ TestResults.ndtVariables[varName] = intValue;
+ continue;
+ }
+ // 2) Try float.
+ floatValue = parseFloat(varValue);
+ if (!isNaN(floatValue)) {
+ // Yes, it's a valid float.
+ TestResults.ndtVariables[varName] = floatValue;
+ continue;
+ }
+ // 3) Neither a valid integer nor a valid float.
+ TestResults.appendErrMsg("Error parsing web100 var. varName: "
+ + varName + "; varValue: " + varValue);
+ }
+ }
+
+ public static function appendClientInfo():void {
+ TestResults.appendResultDetails(ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "clientInfo", null, Main.locale));
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "osData", null, Main.locale)
+ + ": " + Capabilities.os + ", "
+ + ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "architecture", null, Main.locale)
+ + ": " + Capabilities.cpuArchitecture);
+ TestResults.appendResultDetails(
+ "Flash Info: " + ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "version", null, Main.locale)
+ + " = " + Capabilities.version);
+ }
+
+ private static function getClient(osArchitecture:String):String {
+ if (osArchitecture.indexOf("x86") == 0)
+ return ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "pc", null, Main.locale);
+ else
+ return ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "workstation", null, Main.locale);
+ }
+
+ public static function getAccessLinkSpeed():void {
+ if (TestResults.ndtVariables[NDTConstants.C2SDATA]
+ < NDTConstants.DATA_RATE_ETHERNET) {
+ if (TestResults.ndtVariables[NDTConstants.C2SDATA]
+ < NDTConstants.DATA_RATE_RTT) {
+ // Data was not sufficient to determine bottleneck type.
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "unableToDetectBottleneck", null,
+ Main.locale));
+ TestResults.accessTech = NDTConstants.ACCESS_TECH_UNKNOWN;
+ } else {
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "your", null, Main.locale)
+ + " " + getClient(Capabilities.cpuArchitecture) + " "
+ + ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "connectedTo", null, Main.locale));
+
+ if (TestResults.ndtVariables[NDTConstants.C2SDATA]
+ == NDTConstants.DATA_RATE_DIAL_UP) {
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "dialup", null, Main.locale));
+ TestResults.accessTech = NDTConstants.ACCESS_TECH_DIALUP;
+ } else {
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "cabledsl", null, Main.locale));
+ TestResults.accessTech = NDTConstants.ACCESS_TECH_CABLEDSL;
+ }
+ }
+ } else {
+ TestResults.appendResultDetails(ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "theSlowestLink", null, Main.locale));
+ switch(TestResults.ndtVariables[NDTConstants.C2SDATA]) {
+ case NDTConstants.DATA_RATE_ETHERNET:
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "10mbps", null, Main.locale));
+ TestResults.accessTech = NDTConstants.ACCESS_TECH_10MBPS;
+ break;
+ case NDTConstants.DATA_RATE_T3:
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "45mbps", null, Main.locale));
+ TestResults.accessTech = NDTConstants.ACCESS_TECH_45MBPS;
+ break;
+ case NDTConstants.DATA_RATE_FAST_ETHERNET:
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "100mbps", null, Main.locale));
+ TestResults.accessTech = NDTConstants.ACCESS_TECH_100MBPS;
+ // Determine if half/full duplex link was found.
+ if (TestResults.ndtVariables[NDTConstants.HALF_DUPLEX] == 0)
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "fullDuplex", null,
+ Main.locale));
+ else
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "halfDuplex", null,
+ Main.locale));
+ break;
+ case NDTConstants.DATA_RATE_OC_12:
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "622mbps", null, Main.locale));
+ TestResults.accessTech = NDTConstants.ACCESS_TECH_622MBPS;
+ break;
+ case NDTConstants.DATA_RATE_GIGABIT_ETHERNET:
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "1gbps", null, Main.locale));
+ TestResults.accessTech = NDTConstants.ACCESS_TECH_1GBPS;
+ break;
+ case NDTConstants.DATA_RATE_OC_48:
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "2.4gbps", null, Main.locale));
+ TestResults.accessTech = NDTConstants.ACCESS_TECH_2GBPS;
+ break;
+ case NDTConstants.DATA_RATE_10G_ETHERNET:
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "10gbps", null, Main.locale));
+ TestResults.accessTech = NDTConstants.ACCESS_TECH_10GBPS;
+ break;
+ default:
+ TestResults.appendErrMsg(
+ "Non valid value for NDTConstants.C2SDATA: " +
+ TestResults.ndtVariables[NDTConstants.C2SDATA]);
+ }
+ }
+ TestResults.linkSpeed = NDTConstants.ACCESS_TECH2LINK_SPEED[
+ TestResults.accessTech]
+ }
+
+ public static function appendDuplexMismatchResults():void {
+ switch(TestResults.ndtVariables[NDTConstants.MISMATCH]) {
+ case NDTConstants.DUPLEX_NOK_INDICATOR:
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "oldDuplexMismatch", null,
+ Main.locale));
+ break;
+ case NDTConstants.DUPLEX_SWITCH_FULL_HOST_HALF:
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "duplexFullHalf", null,
+ Main.locale));
+ break;
+ case NDTConstants.DUPLEX_SWITCH_HALF_HOST_FULL:
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "duplexHalfFull", null,
+ Main.locale));
+ break;
+ case NDTConstants.DUPLEX_SWITCH_FULL_HOST_HALF_POSS:
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "possibleDuplexFullHalf", null,
+ Main.locale));
+ break;
+ case NDTConstants.DUPLEX_SWITCH_HALF_HOST_FULL_POSS:
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "possibleDuplexHalfFull", null,
+ Main.locale));
+ break;
+ case NDTConstants.DUPLEX_SWITCH_HALF_HOST_FULL_WARN:
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "possibleDuplexHalfFullWarning",
+ null, Main.locale));
+ break;
+ case NDTConstants.DUPLEX_OK_INDICATOR:
+ if (TestResults.ndtVariables[NDTConstants.BAD_CABLE]
+ == NDTConstants.CABLE_STATUS_NOK)
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "excessiveErrors", null,
+ Main.locale));
+
+ if (TestResults.ndtVariables[NDTConstants.CONGESTION]
+ == NDTConstants.CONGESTION_YES)
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "otherTraffic", null,
+ Main.locale));
+ appendRecommendedBufferSize();
+ break;
+ default:
+ TestResults.appendErrMsg("Non valid duplex indicator");
+ }
+ }
+
+ private static function appendRecommendedBufferSize():void {
+ // If we seem to be transmitting less than link speed (i.e calculated
+ // bandwidth is greater than measured throughput), it is possibly due to a
+ // receiver window setting. Advise appropriate size.
+ // Note: All comparisons henceforth of
+ // ((window size * 2/rttsec) < link speed)
+ // are along the same logic.
+ // Window size is multiplied by 2 to counter round-trip.
+ if ((2 * TestResults.ndtVariables[NDTConstants.RWIN]
+ / TestResults.ndtVariables[NDTConstants.RTTSEC])
+ < TestResults.linkSpeed) {
+ // Link speed is in Mbps. Convert to kilo bytes per secs.
+ var linkSpeedInKBps:Number = Number(TestResults.linkSpeed
+ * NDTConstants.KBITS2BITS
+ / NDTConstants.BYTES2BITS)
+ var theoreticalMaxBuffer:Number = (
+ linkSpeedInKBps * NDTConstants.SEC2MSEC
+ * TestResults.ndtVariables[NDTConstants.AVGRTT])
+ if (theoreticalMaxBuffer
+ > TestResults.ndtVariables[NDTConstants.MAXRWINRCVD]) {
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "receiveBufferShouldBe", null,
+ Main.locale)
+ + " " + theoreticalMaxBuffer.toFixed(2)
+ + ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "toMaximizeThroughput", null,
+ Main.locale));
+ }
+ }
+ }
+
+ public static function appendC2SPacketQueueingResults():void {
+ if (TestResults.ndt_test_results::sc2sSpeed
+ < (TestResults.ndt_test_results::c2sSpeed
+ * (1.0 - NDTConstants.SPD_DIFF)))
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "c2sPacketQueuingDetected", null,
+ Main.locale));
+ }
+
+ public static function appendS2CPacketQueueingResults():void {
+ if (TestResults.ndt_test_results::s2cSpeed
+ < (TestResults.ndt_test_results::ss2cSpeed
+ * (1.0 - NDTConstants.SPD_DIFF)))
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "s2cPacketQueuingDetected", null,
+ Main.locale));
+ }
+
+ public static function appendBottleneckResults():void {
+ // 1) Is the connection receiver limited?
+ if (TestResults.ndtVariables[NDTConstants.RWINTIME]
+ > NDTConstants.SND_LIM_TIME_THRESHOLD) {
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "thisConnIs", null, Main.locale)
+ + " " + ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "limitRx", null, Main.locale)
+ + " " + (TestResults.ndtVariables[NDTConstants.RWINTIME]
+ * NDTConstants.PERCENTAGE).toFixed(2)
+ + ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "pctOfTime", null, Main.locale));
+ // Multiplying by 2 to counter round-trip.
+ var receiverLimit:Number = (
+ 2 * TestResults.ndtVariables[NDTConstants.RWIN]
+ / TestResults.ndtVariables[NDTConstants.RTTSEC]);
+ var idealReceiverBuffer:Number = (
+ TestResults.ndtVariables[NDTConstants.MAXRWINRCVD]
+ / NDTConstants.KBITS2BITS);
+ if (receiverLimit < TestResults.linkSpeed)
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "incrRxBuf", null, Main.locale)
+ + " (" + idealReceiverBuffer.toFixed(2) + " KB)"
+ + ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "willImprove", null, Main.locale));
+ }
+
+ // 2) Is the connection sender limited?
+ if (TestResults.ndtVariables[NDTConstants.SENDTIME]
+ > NDTConstants.SND_LIM_TIME_THRESHOLD) {
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "thisConnIs", null, Main.locale)
+ + " " + ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "limitTx", null, Main.locale)
+ + " " + (TestResults.ndtVariables[NDTConstants.SENDTIME]
+ * NDTConstants.PERCENTAGE).toFixed(2)
+ + ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "pctOfTime", null, Main.locale));
+
+ var senderLimit:Number = (
+ 2 * TestResults.ndtVariables[NDTConstants.SWIN]
+ / TestResults.ndtVariables[NDTConstants.RTTSEC]);
+ var idealSenderBuffer:Number = (
+ TestResults.ndtVariables[NDTConstants.SNDBUF]
+ / (2 * NDTConstants.KBITS2BITS));
+
+ if (senderLimit < TestResults.linkSpeed)
+ // Dividing by 2 to counter round-trip.
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "incrTxBuf", null, Main.locale)
+ + " (" + idealSenderBuffer.toFixed(2) + " KB)"
+ + ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "willImprove", null, Main.locale));
+ }
+
+ // 3) Is the connection network limited?
+ if (TestResults.ndtVariables[NDTConstants.CWNDTIME]
+ > NDTConstants.CWND_LIM_TIME_THRESHOLD) {
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "thisConnIs", null, Main.locale)
+ + " " + ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "limitNet", null, Main.locale)
+ + " " + (TestResults.ndtVariables[NDTConstants.CWNDTIME]
+ * NDTConstants.PERCENTAGE).toFixed(2)
+ + ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "pctOfTime", null, Main.locale));
+ }
+
+ // 4) Is the loss excessive?
+ if ((TestResults.ndtVariables[NDTConstants.SPD]
+ < NDTConstants.DATA_RATE_T3)
+ && (TestResults.ndtVariables[NDTConstants.LOSS]
+ > NDTConstants.LOSS_THRESHOLD)) {
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "excLoss", null, Main.locale));
+ }
+ }
+
+ public static function appendDataRateResults():void {
+ switch(TestResults.ndtVariables[NDTConstants.C2SDATA]) {
+ case NDTConstants.DATA_RATE_INSUFFICIENT_DATA:
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "insufficient", null, Main.locale));
+ break;
+ case NDTConstants.DATA_RATE_SYSTEM_FAULT:
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "ipcFail", null, Main.locale));
+ break;
+ case NDTConstants.DATA_RATE_RTT:
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "rttFail", null, Main.locale));
+ break;
+ case NDTConstants.DATA_RATE_DIAL_UP:
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "foundDialup", null, Main.locale));
+ break;
+ case NDTConstants.DATA_RATE_T1:
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "foundDsl", null, Main.locale));
+ break;
+ case NDTConstants.DATA_RATE_ETHERNET:
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "found10mbps", null, Main.locale));
+ break;
+ case NDTConstants.DATA_RATE_T3:
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "found45mbps", null, Main.locale));
+ break;
+ case NDTConstants.DATA_RATE_FAST_ETHERNET:
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "found100mbps", null, Main.locale));
+ break;
+ case NDTConstants.DATA_RATE_OC_12:
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "found622mbps", null, Main.locale));
+ break;
+ case NDTConstants.DATA_RATE_GIGABIT_ETHERNET:
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "found1gbps", null, Main.locale));
+ break;
+ case NDTConstants.DATA_RATE_OC_48:
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "found2.4gbps", null, Main.locale));
+ break;
+ case NDTConstants.DATA_RATE_10G_ETHERNET:
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "found10gbps", null, Main.locale));
+ break;
+ }
+ }
+
+ public static function appendDuplexCongestionMismatchResults():void {
+ if (TestResults.ndtVariables[NDTConstants.HALF_DUPLEX]
+ == NDTConstants.DUPLEX_OK_INDICATOR)
+ TestResults.appendResultDetails(ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "linkFullDpx", null, Main.locale));
+ else
+ TestResults.appendResultDetails(ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "linkHalfDpx", null, Main.locale));
+
+ if (TestResults.ndtVariables[NDTConstants.CONGESTION]
+ == NDTConstants.CONGESTION_NONE)
+ TestResults.appendResultDetails(ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "congestNo", null, Main.locale));
+ else
+ TestResults.appendResultDetails(ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "congestYes", null, Main.locale));
+
+ if (TestResults.ndtVariables[NDTConstants.BAD_CABLE]
+ == NDTConstants.CABLE_STATUS_OK)
+ TestResults.appendResultDetails(ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "cablesOk", null, Main.locale));
+ else
+ TestResults.appendResultDetails(ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "cablesNok", null, Main.locale));
+
+ switch(TestResults.ndtVariables[NDTConstants.MISMATCH]) {
+ case NDTConstants.DUPLEX_OK_INDICATOR:
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "duplexOk", null, Main.locale));
+ break;
+ case NDTConstants.DUPLEX_NOK_INDICATOR:
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "duplexNok", null, Main.locale));
+ break;
+ case NDTConstants.DUPLEX_SWITCH_FULL_HOST_HALF:
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "duplexFullHalf", null,
+ Main.locale));
+ break;
+ case NDTConstants.DUPLEX_SWITCH_HALF_HOST_FULL:
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "duplexHalfFull", null,
+ Main.locale));
+ }
+ }
+
+ public static function appendAvgRTTAndPAcketSizeResults():void {
+ TestResults.appendResultDetails(ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "web100rtt", null, Main.locale)
+ + " = " + TestResults.ndtVariables[NDTConstants.AVGRTT] + "ms");
+ TestResults.appendResultDetails(ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "packetsize", null, Main.locale)
+ + " = " + TestResults.ndtVariables[NDTConstants.CURMSS]
+ + "bytes");
+ }
+
+ public static function appendPacketRetrasmissionResults():void {
+ if (TestResults.ndtVariables[NDTConstants.PKTSRETRANS] > 0) {
+ // Packet retransmissions found.
+ TestResults.appendResultDetails(
+ TestResults.ndtVariables[NDTConstants.PKTSRETRANS] + " "
+ + ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "pktsRetrans", null, Main.locale));
+ TestResults.appendResultDetails(
+ TestResults.ndtVariables[NDTConstants.DUPACKSIN] + " "
+ + ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "dupAcksIn", null, Main.locale));
+ TestResults.appendResultDetails(
+ TestResults.ndtVariables[NDTConstants.SACKSRCVD] + " "
+ + ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "sackReceived", null, Main.locale));
+
+ if (TestResults.ndtVariables[NDTConstants.TIMEOUTS] > 0)
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "connStalled", null, Main.locale)
+ + " " + TestResults.ndtVariables[NDTConstants.TIMEOUTS] + " "
+ + ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "timesPktLoss", null, Main.locale));
+
+ var percIdleTime:Number = (
+ TestResults.ndtVariables[NDTConstants.WAITSEC]
+ / TestResults.ndtVariables[NDTConstants.TIMESEC])
+ * NDTConstants.PERCENTAGE
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "connIdle", null, Main.locale)
+ + " " + TestResults.ndtVariables[NDTConstants.WAITSEC].toFixed(2)
+ + " " + ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "seconds", null, Main.locale)
+ + " (" + percIdleTime.toFixed(2) +
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "pctOfTime", null, Main.locale)
+ + ")");
+ } else if (TestResults.ndtVariables[NDTConstants.DUPACKSIN] > 0) {
+ // No packet loss, but packets arrived out-of-order.
+ var percOrder:Number = (TestResults.ndtVariables[NDTConstants.ORDER]
+ * NDTConstants.PERCENTAGE);
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "noPktLoss1", null, Main.locale)
+ + " - " + ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "ooOrder", null, Main.locale)
+ + " " + percOrder.toFixed(2) +
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "pctOfTime", null, Main.locale));
+ } else {
+ // No packet retransmissions found.
+ TestResults.appendResultDetails(ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "noPktLoss2", null, Main.locale) + ".");
+ }
+ }
+
+ public static function appendPacketQueueingResults(requestedTests:int):void {
+ // Add Packet queueing details found during C2S throughput test.
+ // Data is displayed as percentage.
+ if ((requestedTests & TestType.C2S) == TestType.C2S) {
+ // TODO(tiziana): Change when issue #98 is fixed.
+ // https://code.google.com/p/ndt/issues/detail?id=98
+ if (TestResults.ndt_test_results::c2sSpeed
+ > TestResults.ndt_test_results::sc2sSpeed) {
+ var c2sQueue:Number = (TestResults.ndt_test_results::c2sSpeed
+ - TestResults.ndt_test_results::sc2sSpeed)
+ / TestResults.ndt_test_results::c2sSpeed;
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "c2s", null, Main.locale)
+ + " " +
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "qSeen", null, Main.locale)
+ + ": " + (NDTConstants.PERCENTAGE * c2sQueue).toFixed(2) + "%");
+ }
+ }
+
+ // Add packet queueing details found during S2C throughput test.
+ // Data is displayed as a percentage.
+ if ((requestedTests & TestType.S2C) == TestType.S2C) {
+ // TODO(tiziana): Change when issue #98 is fixed.
+ // https://code.google.com/p/ndt/issues/detail?id=98
+ if (TestResults.ndt_test_results::ss2cSpeed
+ > TestResults.ndt_test_results::s2cSpeed) {
+ var s2cQueue:Number = (TestResults.ndt_test_results::c2sSpeed
+ - TestResults.ndt_test_results::sc2sSpeed)
+ / TestResults.ndt_test_results::c2sSpeed;
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "s2c", null, Main.locale)
+ + " " + ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "qSeen", null, Main.locale)
+ + ": " + (NDTConstants.PERCENTAGE * s2cQueue).toFixed(2) + "%");
+ }
+ }
+ }
+
+ public static function appendTCPNegotiatedOptions():void {
+ TestResults.appendResultDetails(ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "web100tcpOpts", null, Main.locale));
+
+ TestResults.appendResultDetails("RFC 2018 Selective Acknowledgement:");
+ if (TestResults.ndtVariables[NDTConstants.SACKENABLED]
+ == NDTConstants.SACKENABLED_OFF)
+ TestResults.appendResultDetails(ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "off", null, Main.locale));
+ else
+ TestResults.appendResultDetails(ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "on", null, Main.locale));
+
+ TestResults.appendResultDetails("RFC 896 Nagle Algorithm:");
+ if (TestResults.ndtVariables[NDTConstants.NAGLEENABLED]
+ == NDTConstants.NAGLEENABLED_OFF)
+ TestResults.appendResultDetails(ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "off", null, Main.locale));
+ else
+ TestResults.appendResultDetails(ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "on", null, Main.locale));
+
+ TestResults.appendResultDetails(
+ "RFC 3168 Explicit Congestion Notification:");
+ if (TestResults.ndtVariables[NDTConstants.ECNENABLED]
+ == NDTConstants.ECNENABLED_OFF)
+ TestResults.appendResultDetails(ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "off", null, Main.locale));
+ else
+ TestResults.appendResultDetails(ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "on", null, Main.locale));
+
+ TestResults.appendResultDetails("RFC 1323 Time Stamping:");
+ if (TestResults.ndtVariables[NDTConstants.TIMESTAMPSENABLED]
+ == NDTConstants.TIMESTAMPSENABLED_OFF)
+ TestResults.appendResultDetails(ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "off", null, Main.locale));
+ else
+ TestResults.appendResultDetails(ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "on", null, Main.locale));
+
+ TestResults.appendResultDetails("RFC 1323 Window Scaling:");
+ if ((TestResults.ndtVariables[NDTConstants.MAXRWINRCVD]
+ < NDTConstants.TCP_MAX_RECV_WIN_SIZE)
+ || (TestResults.ndtVariables[NDTConstants.WINSCALERCVD]
+ > NDTConstants.TCP_MAX_WINSCALERCVD)) {
+ // Max rcvd window size lesser than TCP's max value, so no scaling
+ // requested.
+ TestResults.appendResultDetails(ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "off", null, Main.locale));
+ } else
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "on", null, Main.locale) + "; "
+ + ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "scalingFactors", null, Main.locale)
+ + " - " + ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "server", null, Main.locale) + "="
+ + TestResults.ndtVariables[NDTConstants.WINSCALERCVD] + ", "
+ + ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "client", null, Main.locale) + "="
+ + TestResults.ndtVariables[NDTConstants.WINSCALESENT]);
+ }
+
+ public static function appendThroughputLimitResults():void {
+ // Adding more details related to factors influencing throughput.
+
+ // 1) Theoretical network limit.
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "theoreticalLimit", null, Main.locale)
+ + " " + TestResults.ndtVariables[NDTConstants.BW].toFixed(2) + " "
+ + "Mbps");
+
+ // 2) NDT server buffer imposed limit.
+ // Divide by 2 to counter round-trip.
+ var ndtServerBuffer:Number = (
+ TestResults.ndtVariables[NDTConstants.SNDBUF]
+ / (2 * NDTConstants.KBITS2BITS))
+ var ndtServerLimit:Number = (
+ TestResults.ndtVariables[NDTConstants.SWIN]
+ / TestResults.ndtVariables[NDTConstants.RTTSEC])
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "ndtServerHas", null, Main.locale)
+ + " " + ndtServerBuffer.toFixed(2) + " "
+ + ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "kbyteBufferLimits", null, Main.locale)
+ + " " + ndtServerLimit.toFixed(2) + " Mbps");
+
+ // PC buffer imposed throughput limit.
+ var pcReceiverBuffer:Number = (
+ TestResults.ndtVariables[NDTConstants.MAXRWINRCVD]
+ / NDTConstants.KBITS2BITS)
+ var pcLimit:Number = (TestResults.ndtVariables[NDTConstants.RWIN]
+ / TestResults.ndtVariables[NDTConstants.RTTSEC]);
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "yourPcHas", null, Main.locale)
+ + " " + pcReceiverBuffer.toFixed(2) + " "
+ + ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "kbyteBufferLimits", null, Main.locale)
+ + " " + pcLimit.toFixed(2) + " Mbps");
+
+ // Network based flow control limit imposed throughput limit.
+ var networkLimit:Number = (
+ TestResults.ndtVariables[NDTConstants.CWIN]
+ / TestResults.ndtVariables[NDTConstants.RTTSEC])
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "flowControlLimits", null, Main.locale)
+ + " " + networkLimit.toFixed(2) + " Mbps");
+
+ // Client and server data reports on link capacity.
+ var c2sData:String = TestResultsUtils.getDataRateString(
+ TestResults.ndtVariables[NDTConstants.C2SDATA]);
+ var c2sAck:String = TestResultsUtils.getDataRateString(
+ TestResults.ndtVariables[NDTConstants.C2SACK]);
+ var s2cData:String = TestResultsUtils.getDataRateString(
+ TestResults.ndtVariables[NDTConstants.S2CDATA]);
+ var s2cAck:String = TestResultsUtils.getDataRateString(
+ TestResults.ndtVariables[NDTConstants.S2CACK]);
+
+ if (c2sData != null)
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "clientDataReports", null, Main.locale)
+ + " " + c2sData);
+ if (c2sAck != null)
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "clientAcksReport", null, Main.locale)
+ + " " + c2sAck);
+ if (s2cData != null)
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "serverDataReports", null, Main.locale)
+ + " " + s2cData);
+ if (s2cAck != null)
+ TestResults.appendResultDetails(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "serverAcksReport", null, Main.locale)
+ + " " + s2cAck);
+ }
+ }
+}
+
=======================================
--- /dev/null
+++ /trunk/flash-client/src/TestS2C.as Sun Feb 2 19:14:17 2014 UTC
@@ -0,0 +1,510 @@
+// Copyright 2013 M-Lab
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package {
+ import flash.errors.IOError;
+ import flash.events.Event;
+ import flash.events.IOErrorEvent;
+ import flash.events.ProgressEvent;
+ import flash.events.SecurityErrorEvent;
+ import flash.events.TimerEvent;
+ import flash.net.Socket;
+ import flash.utils.ByteArray;
+ import flash.utils.getTimer;
+ import flash.utils.Timer;
+ import mx.resources.ResourceManager;
+
+ /**
+ * This class performs the Server-to-Client throughput test.
+ */
+ public class TestS2C {
+ // Timer for single read operation.
+ private const READ_TIMEOUT:int = 15000; // 15sec
+
+ // Valid values for _testStage.
+ private static const PREPARE_TEST1:int = 0;
+ private static const PREPARE_TEST2:int = 1;
+ private static const START_TEST:int = 2;
+ private static const RECEIVE_DATA:int = 3;
+ private static const COMPARE_SERVER1:int = 4;
+ private static const COMPARE_SERVER2:int = 5;
+ private static const COMPUTE_THROUGHPUT:int = 6;
+ private static const GET_WEB1001:int = 7;
+ private static const GET_WEB1002:int = 8;
+ private static const END_TEST:int = 9;
+
+ private var _callerObj:NDTPController;
+ private var _ctlSocket:Socket;
+ private var _msg:Message;
+ private var _readTimer:Timer;
+ private var _s2cByteCount:int;
+ private var _s2cSocket:Socket;
+ private var _s2cTimer:Timer;
+ // Time to send data to client on the S2C socket.
+ private var _s2cTestDuration:Number;
+ private var _s2cTestSuccess:Boolean;
+ private var _serverHostname:String;
+ private var _testStage:int;
+ private var _web100VarResult:String;
+
+
+ public function TestS2C(ctlSocket:Socket, serverHostname:String,
+ callerObj:NDTPController) {
+ _callerObj = callerObj;
+ _ctlSocket = ctlSocket;
+ _serverHostname = serverHostname;
+
+ _s2cTestSuccess = true; // Initially the test has not failed.
+ _s2cTestDuration = 0;
+ _s2cByteCount = 0;
+ _web100VarResult = "";
+ }
+
+ public function run():void {
+ TestResults.appendDebugMsg(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "startingTest", null, Main.locale) +
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "s2cThroughput", null, Main.locale))
+ NDTUtils.callExternalFunction("startTested", "ServerToClientThroughput");
+ TestResults.appendDebugMsg("S2C test: PREPARE_TEST stage.");
+ TestResults.appendDebugMsg(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "runningInboundTest", null, Main.locale));
+ TestResults.ndt_test_results::ndtTestStatus = "runningInboundTest";
+
+ addCtlSocketOnReceivedDataListener();
+ _msg = new Message();
+ _testStage = PREPARE_TEST1;
+ if (_ctlSocket.bytesAvailable > 0) {
+ // In case data arrived before starting the ProgressEvent.SOCKET_DATA
+ // listener.
+ prepareTest1();
+ }
+ }
+
+ private function addCtlSocketOnReceivedDataListener():void {
+ _ctlSocket.addEventListener(ProgressEvent.SOCKET_DATA, onCtlReceivedData);
+ }
+
+ private function removeCtlSocketOnReceivedDataListener():void {
+ _ctlSocket.removeEventListener(ProgressEvent.SOCKET_DATA,
+ onCtlReceivedData);
+ }
+
+ private function onCtlReceivedData(e:ProgressEvent):void {
+ switch (_testStage) {
+ case PREPARE_TEST1: prepareTest1();
+ break;
+ case PREPARE_TEST2: prepareTest2();
+ break;
+ case START_TEST: startTest();
+ break;
+ case COMPARE_SERVER1: compareWithServer1();
+ break;
+ case COMPARE_SERVER2: compareWithServer2();
+ break;
+ case GET_WEB1001: getWeb100Vars1();
+ break;
+ case GET_WEB1002: getWeb100Vars2();
+ break;
+ case END_TEST: endTest();
+ break;
+ }
+ }
+
+ private function prepareTest1():void {
+ if (!_msg.readHeader(_ctlSocket))
+ return;
+
+ _testStage = PREPARE_TEST2;
+ if (_ctlSocket.bytesAvailable > 0)
+ // In case header and body have arrive together at the client, they
+ // trigger a single ProgressEvent.SOCKET_DATA event. In such case, it's
+ // necessary to explicitly call the following function to move to the
+ // next step.
+ prepareTest2();
+ }
+
+ private function prepareTest2():void {
+ if (!_msg.readBody(_ctlSocket, _msg.length))
+ return;
+
+ if (_msg.type != MessageType.TEST_PREPARE) {
+ TestResults.appendErrMsg(ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "inboundWrongMessage", null,
+ Main.locale));
+ if (_msg.type == MessageType.MSG_ERROR) {
+ TestResults.appendErrMsg(
+ "ERROR MESSAGE : " + parseInt(new String(_msg.body), 16));
+ }
+ _s2cTestSuccess = false;
+ endTest();
+ return;
+ }
+
+ var s2cPort:int = parseInt(new String(_msg.body));
+ _s2cSocket = new Socket();
+ addS2CSocketEventListeners();
+ try {
+ _s2cSocket.connect(_serverHostname, s2cPort);
+ } catch(e:IOError) {
+ TestResults.appendErrMsg("S2C socket connect IO error: " + e);
+ _s2cTestSuccess = false;
+ endTest();
+ return;
+ } catch(e:SecurityError) {
+ TestResults.appendErrMsg("S2C socket connect security error: " + e);
+ _s2cTestSuccess = false;
+ endTest();
+ return;
+ }
+ _readTimer = new Timer(READ_TIMEOUT);
+ _readTimer.addEventListener(TimerEvent.TIMER, onS2CTimeout);
+ _s2cTimer = new Timer(NDTConstants.S2C_DURATION);
+ _s2cTimer.addEventListener(TimerEvent.TIMER, onS2CTimeout);
+ _msg = new Message();
+ _testStage = START_TEST;
+ TestResults.appendDebugMsg("S2C test: START_TEST stage.");
+
+ if (_ctlSocket.bytesAvailable > 0)
+ // If TEST_PREPARE and TEST_START messages arrive together at the client
+ // they trigger a single ProgressEvent.SOCKET_DATA event. In such case,
+ // it's necessary to explicitly call the following function to move to
+ // the next step.
+ startTest();
+ }
+
+ private function addS2CSocketEventListeners():void {
+ _s2cSocket.addEventListener(Event.CONNECT, onS2CConnect);
+ _s2cSocket.addEventListener(Event.CLOSE, onS2CClose);
+ _s2cSocket.addEventListener(IOErrorEvent.IO_ERROR, onS2CError);
+ _s2cSocket.addEventListener(SecurityErrorEvent.SECURITY_ERROR,
+ onS2CSecError);
+ _s2cSocket.addEventListener(ProgressEvent.SOCKET_DATA, onS2CReceivedData);
+ }
+
+ private function removeS2CSocketEventListeners():void {
+ _s2cSocket.removeEventListener(Event.CONNECT, onS2CConnect);
+ _s2cSocket.removeEventListener(Event.CLOSE, onS2CClose);
+ _s2cSocket.removeEventListener(IOErrorEvent.IO_ERROR, onS2CError);
+ _s2cSocket.removeEventListener(SecurityErrorEvent.SECURITY_ERROR,
+ onS2CSecError);
+ _s2cSocket.removeEventListener(ProgressEvent.SOCKET_DATA,
+ onS2CReceivedData);
+ }
+
+ private function onS2CConnect(e:Event):void {
+ TestResults.appendDebugMsg("S2C socket connected.");
+ }
+
+ private function onS2CClose(e:Event):void {
+ TestResults.appendDebugMsg("S2C socket closed by the server.");
+ closeS2CSocket();
+ }
+
+ private function onS2CError(e:IOErrorEvent):void {
+ TestResults.appendErrMsg("IOError on S2C socket: : " + e);
+ _s2cTestSuccess = false;
+ closeS2CSocket();
+ endTest();
+ }
+
+ private function onS2CSecError(e:SecurityErrorEvent):void {
+ TestResults.appendErrMsg("Security error on S2C socket: " + e);
+ _s2cTestSuccess = false;
+ closeS2CSocket();
+ endTest();
+ }
+
+ private function onS2CReceivedData(e:ProgressEvent):void {
+ _readTimer.stop();
+ _readTimer.reset();
+ _readTimer.start();
+ receiveData();
+ }
+
+ private function startTest():void {
+ if (!_msg.readHeader(_ctlSocket))
+ return;
+ // TEST_START message has no body.
+
+ if (_msg.type != MessageType.TEST_START) {
+ // See https://code.google.com/p/ndt/issues/detail?id=105
+ TestResults.appendErrMsg(ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "inboundWrongMessage", null, Main.locale));
+ if (_msg.type == MessageType.MSG_ERROR) {
+ TestResults.appendErrMsg("ERROR MSG");
+ }
+ _s2cTestSuccess = false;
+ endTest();
+ return;
+ }
+
+ // Remove Control socket listener so it does not interfere with the S2C
+ // socket listeners.
+ removeCtlSocketOnReceivedDataListener();
+
+ _readTimer.start();
+ _s2cTimer.start();
+ // Record start time right before it starts receiving data, to be as
+ // accurate as possible.
+ _s2cTestDuration = getTimer();
+
+ _testStage = RECEIVE_DATA;
+ TestResults.appendDebugMsg("S2C test: RECEIVE_DATA stage.");
+ if (_s2cSocket.bytesAvailable > 0)
+ receiveData();
+ }
+
+ private function onS2CTimeout(e:TimerEvent):void {
+ TestResults.appendDebugMsg("Timeout for receiving data on S2C socket.");
+ closeS2CSocket();
+ }
+
+ /**
+ * Function that is called repeatedly by the S2C socket response listener
+ * for the duration of the test. It processes and keeps track of the total
+ * bytes received from the server. The test only goes past this stage if:
+ * 1. All data was successfully received and the server closed the socket.
+ * 2. A read timeout occured on S2C socket.
+ * 3. More than NDTConstants.S2C_DURATION seconds have passed since the
+ * beginning of the test.
+ */
+ private function receiveData():void {
+ _s2cByteCount += NDTUtils.readAllBytesAndDiscard(_s2cSocket);
+ }
+
+ private function closeS2CSocket():void {
+ // Record end time right after it stops receiving data, to be as accurate
+ // as possible.
+ _s2cTimer.stop();
+ _s2cTestDuration = getTimer() - _s2cTestDuration;
+ TestResults.appendDebugMsg(
+ "S2C test lasted " + _s2cTestDuration + " msec.");
+ _readTimer.stop();
+ _readTimer.removeEventListener(TimerEvent.TIMER, onS2CTimeout);
+ _s2cTimer.removeEventListener(TimerEvent.TIMER, onS2CTimeout);
+
+ if (_s2cSocket.connected)
+ _s2cByteCount += _s2cSocket.bytesAvailable;
+
+ removeCtlSocketOnReceivedDataListener();
+ try {
+ _s2cSocket.close();
+ TestResults.appendDebugMsg("S2C socket closed by the client.");
+
+ } catch (e:IOError) {
+ TestResults.appendErrMsg(
+ "IO Error while closing S2C socket: " + e);
+ }
+ addCtlSocketOnReceivedDataListener();
+
+ _msg = new Message();
+ _testStage = COMPARE_SERVER1;
+ TestResults.appendDebugMsg("S2C test: COMPARE_SERVER stage.");
+
+ // The following check is probably not necessary. Added anyway, in case
+ // the COMPARE_SERVER message does not trigger onReceivedData.
+ if (_ctlSocket.bytesAvailable > 0)
+ compareWithServer1();
+ }
+
+ private function compareWithServer1():void {
+ if (!_msg.readHeader(_ctlSocket))
+ return;
+
+ _testStage = COMPARE_SERVER2;
+ if (_ctlSocket.bytesAvailable > 0)
+ // In case header and body have arrive together at the client, they
+ // trigger a single ProgressEvent.SOCKET_DATA event. In such case,
+ // it's necessary to explicitly call the following function to move to
+ // the next step.
+ compareWithServer2();
+ }
+
+ private function compareWithServer2():void {
+ if (!_msg.readBody(_ctlSocket, _msg.length))
+ return;
+
+ if (_msg.type != MessageType.TEST_MSG) {
+ TestResults.appendErrMsg(ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "inboundWrongMessage", null,
+ Main.locale));
+ if (_msg.type == MessageType.MSG_ERROR) {
+ TestResults.appendErrMsg("ERROR MSG: "
+ + parseInt(new String(_msg.body), 16));
+ }
+ _s2cTestSuccess = false;
+ endTest();
+ return;
+ }
+
+ var _msgBody:String = new String(_msg.body);
+ var _msgFields:Array = _msgBody.split(" ");
+ if (_msgFields.length != 3) {
+ TestResults.appendErrMsg(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "inboundWrongMessage", null,
+ Main.locale)
+ + "Message received: " + _msgBody);
+ _s2cTestSuccess = false;
+ endTest();
+ return;
+ }
+
+ var sc2sSpeed:Number = parseFloat(_msgFields[0]);
+ var sSendQueue:int = parseInt(_msgFields[1]);
+ var sBytes:Number = parseFloat(_msgFields[2]);
+ if (isNaN(sc2sSpeed) || isNaN(sSendQueue) || isNaN(sBytes)) {
+ TestResults.appendErrMsg(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "inboundWrongMessage", null,
+ Main.locale)
+ + "Message received: " + _msgBody);
+ _s2cTestSuccess = false;
+ endTest();
+ return;
+ }
+
+ sc2sSpeed = sc2sSpeed / NDTConstants.SEC2MSEC * NDTConstants.KBITS2BITS;
+ TestResults.ndt_test_results::ss2cSpeed = sc2sSpeed;
+ TestResults.appendDebugMsg("S2C throughput computed by the server is "
+ + sc2sSpeed.toFixed(2) + " kbps");
+
+ _testStage = COMPUTE_THROUGHPUT;
+ calculateThroughput();
+ }
+
+ private function calculateThroughput():void {
+ TestResults.appendDebugMsg("S2C test: COMPUTE_THROUGHPUT stage.");
+
+ TestResults.appendDebugMsg("S2C test sent " + _s2cByteCount + " bytes.");
+
+ var s2cSpeed:Number = (
+ _s2cByteCount * NDTConstants.BYTES2BITS / _s2cTestDuration);
+ TestResults.ndt_test_results::s2cSpeed = s2cSpeed;
+ TestResults.appendDebugMsg("S2C throughput computed by the client is "
+ + s2cSpeed.toFixed(2) + " kbps.");
+
+ var sendData:ByteArray = new ByteArray();
+ sendData.writeFloat(s2cSpeed);
+ TestResults.appendDebugMsg(
+ "Sending '" + s2cSpeed + "' back to the server.");
+
+ var _msgToSend:Message = new Message(MessageType.TEST_MSG, sendData);
+ if (!_msgToSend.sendMessage(_ctlSocket)) {
+ _s2cTestSuccess = false;
+ endTest();
+ return;
+ }
+
+ _msg = new Message();
+ _readTimer = new Timer(READ_TIMEOUT);
+ _readTimer.addEventListener(TimerEvent.TIMER, onWeb100ReadTimeout);
+ _readTimer.start();
+ _testStage = GET_WEB1001;
+ TestResults.appendDebugMsg("S2C test: GET_WEB100 stage.");
+ if (_ctlSocket.bytesAvailable > 0) {
+ getWeb100Vars1();
+ }
+ }
+
+ private function onWeb100ReadTimeout(e:TimerEvent):void {
+ TestResults.appendErrMsg("Timeout when reading web100 variables.");
+ _readTimer.removeEventListener(TimerEvent.TIMER, onWeb100ReadTimeout);
+
+ _s2cTestSuccess = false;
+ _testStage = END_TEST;
+ endTest();
+ }
+
+ /**
+ * Function that gets all the web100 variables as name-value string pairs.
+ * It is called multiple times by the response listener of the Control
+ * socket and adds more data to _web100VarResult every call.
+ */
+ private function getWeb100Vars1():void {
+ if (!_msg.readHeader(_ctlSocket))
+ return;
+
+ if (_msg.type == MessageType.TEST_FINALIZE) {
+ // All web100 variables have been sent by the server.
+ _readTimer.stop();
+ _readTimer.removeEventListener(TimerEvent.TIMER, onWeb100ReadTimeout);
+ _s2cTestSuccess = true;
+ _testStage = END_TEST;
+ endTest();
+ return;
+ }
+
+ _testStage = GET_WEB1002;
+ if (_ctlSocket.bytesAvailable > 0)
+ getWeb100Vars2();
+ }
+
+
+ private function getWeb100Vars2():void {
+ if (!_msg.readBody(_ctlSocket, _msg.length))
+ return;
+
+ if (_msg.type != MessageType.TEST_MSG) {
+ TestResults.appendErrMsg(ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "inboundWrongMessage", null,
+ Main.locale));
+ if (_msg.type == MessageType.MSG_ERROR) {
+ TestResults.appendErrMsg("ERROR MSG: "
+ + parseInt(new String(_msg.body), 16));
+ }
+ _readTimer.stop();
+ _readTimer.removeEventListener(TimerEvent.TIMER, onWeb100ReadTimeout);
+ _s2cTestSuccess = false;
+ _testStage = END_TEST;
+ endTest();
+ return;
+ }
+ _web100VarResult += new String(_msg.body);
+ _testStage = GET_WEB1001;
+ if (_ctlSocket.bytesAvailable > 0)
+ getWeb100Vars1();
+ }
+
+ private function endTest():void {
+ TestResults.ndt_test_results::s2cTestResults = _web100VarResult;
+ removeCtlSocketOnReceivedDataListener();
+
+ TestResults.appendDebugMsg("S2C test: END_TEST stage.");
+
+ if (_s2cTestSuccess)
+ TestResults.appendDebugMsg(
+ ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "s2cThroughput", null, Main.locale)
+ + " test " + ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "done", null, Main.locale));
+ else
+ TestResults.appendDebugMsg(ResourceManager.getInstance().getString(
+ NDTConstants.BUNDLE_NAME, "s2cThroughputFailed", null,
+ Main.locale));
+
+ TestResults.ndt_test_results::s2cTestSuccess = _s2cTestSuccess;
+ TestResults.ndt_test_results::ndtTestStatus = "done";
+ NDTUtils.callExternalFunction(
+ "testCompleted", "ServerToClientThroughput",
+ (!_s2cTestSuccess).toString());
+
+ _callerObj.runTests();
+ }
+ }
+}
+
=======================================
--- /dev/null
+++ /trunk/flash-client/src/TestType.as Sun Feb 2 19:14:17 2014 UTC
@@ -0,0 +1,44 @@
+// Copyright 2013 M-Lab
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package {
+ /**
+ * Class that defines the types of NDT tests as expected by the NDT server.
+ */
+ public class TestType {
+ public static const MID:int = (1 << 0);
+ public static const C2S:int = (1 << 1);
+ public static const S2C:int = (1 << 2);
+ public static const SFW:int = (1 << 3);
+ public static const STATUS:int = (1 << 4);
+ public static const META:int = (1 << 5);
+
+ /*
+ * Converts a space-separatparseInt(item)ed list of strings to a bitwise-OR
+ * of each non-zero int.
+ */
+ public static function listToBitwiseOR(testString:String):int {
+ var testInt:int = 0;
+ for each (var item:String in testString.split(" ")) {
+ var currentTest:int = parseInt(item);
+ if (isNaN(currentTest)) {
+ TestResults.appendErrMsg("Non valid test id: " + item);
+ continue;
+ }
+ testInt = testInt | currentTest;
+ }
+ return testInt;
+ }
+ }
+}
=======================================
--- /dev/null
+++ /trunk/flash-client/src/UserAgentTools.as Sun Feb 2 19:14:17 2014 UTC
@@ -0,0 +1,280 @@
+// This class has code taken from
+// http://nerds.palmdrive.net/useragent/code.html
+// In that page the author of the code states that the code is free for all the
+// uses and he believes it is too small to be copyrightable.
+
+// Copyright 2013 M-Lab
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package {
+ import mx.resources.ResourceManager;
+ import mx.utils.StringUtil;
+ /**
+ * This class is use to obtain information about who is accessing a web-server.
+ * When a web browser accesses a web-server, it usually transmits a "User-Agent"
+ * string. This is expected to include the name and versions of the browser
+ * and the underlying Operating System. Though the information inside a user-
+ * agent string is not restricted to these alone, currently NDT uses this to
+ * get Browser OS only.
+ */
+ public class UserAgentTools {
+ private static function isLower(sParam:String):Boolean {
+ return (sParam == sParam.toLowerCase());
+ }
+
+ private static function isLetter(sParam:String):Boolean {
+ return (sParam >= "A" && sParam <= "z");
+ }
+
+ private static function isDigit(sParam:String):Boolean {
+ return (sParam >= "0" && sParam <= "9");
+ }
+
+ public static function getFirstVersionNumber(a_userAgent:String,
+ a_position:int,
+ numDigits:int):String {
+ var ver:String = getVersionNumber(a_userAgent, a_position);
+
+ if (ver == null)
+ return "";
+ var i:int = 0;
+ var res:String = "";
+ while (i < ver.length && i < numDigits) {
+ res += (ver.charAt(i)).toString();
+ i++;
+ }
+ return res;
+ }
+
+ /*
+ Example UserAgent String:
+ Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)
+ Chrome/29.0.1547.2 Safari/537.36
+ */
+ public static function getVersionNumber(a_userAgent:String,
+ a_position:int):String {
+ if(a_position < 0)
+ return "";
+
+ var res:String = new String();
+ var status:int = 0;
+ while (a_position < a_userAgent.length) {
+ var c:String = a_userAgent.charAt(a_position);
+ switch(status) {
+ case 0: // No valid digits encountered yet
+ if (c == ' ' || c == '/')
+ break;
+ if (c == ';' || c == ')')
+ return "";
+ status = 1;
+ case 1: // Version number in progress
+ if (c == ';' || c == '/' || c == ')' || c == '(' || c == '[')
+ return StringUtil.trim(res);
+ if (c == ' ')
+ status = 2;
+ res = new String(res + c);
+ break;
+ case 2: // Space encountered - Might need to end the parsing
+ if ((isLetter(c) && isLower(c)) || isDigit(c)) {
+ res = new String(res + c);
+ status = 1;
+ } else return StringUtil.trim(res);
+ break;
+ }
+ a_position++;
+ }
+ return StringUtil.trim(res);
+ }
+
+ public static function getBotName(userAgent:String):Array {
+ userAgent = userAgent.toLowerCase();
+ var pos:int = 0;
+ var res:String = null;
+ if ((pos = userAgent.indexOf("help.yahoo.com/")) > -1) {
+ res = "Yahoo";
+ pos += 7;
+ } else if ((pos = userAgent.indexOf("google/")) > -1) {
+ res = "Google";
+ pos += 7;
+ } else if ((pos = userAgent.indexOf("msnbot/")) > -1) {
+ res = "MSNBot";
+ pos += 7;
+ } else if ((pos = userAgent.indexOf("googlebot/")) > -1) {
+ res = "Google";
+ pos += 10;
+ } else if ((pos = userAgent.indexOf("webcrawler/")) > -1) {
+ res = "WebCrawler";
+ pos += 11;
+ } else if ((pos = userAgent.indexOf("inktomi")) > -1) {
+ // The following two bots don't have any
+ // version number in their User-Agent strings.
+ res = "Inktomi";
+ pos = -1;
+ } else if ((pos = userAgent.indexOf("teoma")) > -1) {
+ res = "Teoma";
+ pos = -1;
+ }
+ if(res == null)
+ return null;
+ return [res, res, res + getVersionNumber(userAgent, pos)];
+ }
+
+ public static function getBrowser(userAgent:String):Array {
+ if(userAgent == null) {
+ return ["?", "?", "?"];
+ }
+ var botName:Array = new Array();
+ if((botName = getBotName(userAgent)) != null)
+ return botName;
+
+ var res:Array = null;
+ var pos:int;
+ if ((pos = userAgent.indexOf("Lotus-Notes/")) > -1) {
+ res = ["LotusNotes", "LotusNotes", "LotusNotes"
+ + getVersionNumber(userAgent, pos + 12)];
+ } else if ((pos = userAgent.indexOf("Opera")) > -1) {
+ var ver:String = getVersionNumber(userAgent, pos + 5);
+ res = ["Opera",
+ "Opera" + getFirstVersionNumber(userAgent, pos + 5, 1),
+ "Opera" + ver];
+ if ((pos = userAgent.indexOf("Opera Mini/")) > -1) {
+ var ver2:String = getVersionNumber(userAgent, pos + 11);
+ res = ["Opera", "Opera Mini", "Opera Mini " + ver2];
+ } else if ((pos = userAgent.indexOf("Opera Mobi/")) > -1) {
+ var vers2:String = getVersionNumber(userAgent, pos + 11);
+ res = ["Opera", "Opera Mobi", "Opera Mobi " + vers2];
+ }
+ } else if (userAgent.indexOf("MSIE") > -1) {
+ if ((pos = userAgent.indexOf("MSIE 6.0")) > -1) {
+ res = ["MSIE", "MSIE6",
+ "MSIE" + getVersionNumber(userAgent, pos + 4)];
+ } else if ((pos = userAgent.indexOf("MSIE 5.0")) > -1) {
+ res = ["MSIE", "MSIE5",
+ "MSIE" + getVersionNumber(userAgent, pos + 4)];
+ } else if ((pos = userAgent.indexOf("MSIE 5.5")) > -1) {
+ res = ["MSIE", "MSIE5.5",
+ "MSIE" + getVersionNumber(userAgent, pos + 4)];
+ } else if ((pos = userAgent.indexOf("MSIE 5.")) > -1) {
+ res = ["MSIE", "MSIE5.x",
+ "MSIE" + getVersionNumber(userAgent, pos + 4)];
+ } else if ((pos = userAgent.indexOf("MSIE 4")) > -1) {
+ res = ["MSIE", "MSIE4",
+ "MSIE" + getVersionNumber(userAgent, pos + 4)];
+ } else if ((pos = userAgent.indexOf("MSIE 7")) > -1
+ && userAgent.indexOf("Trident/4.0") < 0) {
+ res = ["MSIE", "MSIE7",
+ "MSIE" + getVersionNumber(userAgent, pos + 4)];
+ } else if ((pos = userAgent.indexOf("MSIE 8")) > -1
+ || userAgent.indexOf("Trident/4.0") > -1) {
+ res = ["MSIE", "MSIE8",
+ "MSIE" + getVersionNumber(userAgent, pos + 4)];
+ } else if ((pos = userAgent.indexOf("MSIE 9")) > -1
+ || userAgent.indexOf("Trident/4.0") > -1) {
+ res = ["MSIE", "MSIE9",
+ "MSIE" + getVersionNumber(userAgent, pos + 4)];
+ } else
+ res = ["MSIE", "MSIE?", "MSIE?"
+ + getVersionNumber(userAgent,
+ userAgent.indexOf("MSIE") + 4)];
+ } else if ((pos = userAgent.indexOf("Gecko/")) > -1) {
+ res = ["Gecko", "Gecko",
+ "Gecko" + getFirstVersionNumber(userAgent, pos + 5, 4)];
+ if ((pos = userAgent.indexOf("Camino/")) > -1) {
+ res[1] += "(Camino)";
+ res[2] += "(Camino" + getVersionNumber(userAgent, pos + 7)
+ + ")";
+ } else if ((pos = userAgent.indexOf("Chimera/")) > -1) {
+ res[1] += "(Chimera)";
+ res[2] += "(Chimera" + getVersionNumber(userAgent, pos + 8)
+ + ")";
+ } else if ((pos = userAgent.indexOf("Firebird/")) > -1) {
+ res[1] += "(Firebird)";
+ res[2] += "(Firebird" + getVersionNumber(userAgent, pos + 9)
+ + ")";
+ } else if ((pos = userAgent.indexOf("Phoenix/")) > -1) {
+ res[1] += "(Phoenix)";
+ res[2] += "(Phoenix" + getVersionNumber(userAgent, pos + 8)
+ + ")";
+ } else if ((pos = userAgent.indexOf("Galeon/")) > -1) {
+ res[1] += "(Galeon)";
+ res[2] += "(Galeon" + getVersionNumber(userAgent, pos + 7)
+ + ")";
+ } else if ((pos = userAgent.indexOf("Firefox/")) > -1) {
+ res[1] += "(Firefox)";
+ res[2] += "(Firefox" + getVersionNumber(userAgent, pos + 8)
+ + ")";
+ } else if ((pos = userAgent.indexOf("Netscape/")) > -1) {
+ if ((pos = userAgent.indexOf("Netscape/6")) > -1) {
+ res[1] += "(NS6)";
+ res[2] += "(NS" + getVersionNumber(userAgent, pos + 9)
+ + ")";
+ } else if ((pos = userAgent.indexOf("Netscape/7")) > -1) {
+ res[1] += "(NS7)";
+ res[2] += "(NS" + getVersionNumber(userAgent, pos + 9)
+ + ")";
+ } else if ((pos = userAgent.indexOf("Netscape/8")) > -1) {
+ res[1] += "(NS8)";
+ res[2] += "(NS" + getVersionNumber(userAgent, pos + 9)
+ + ")";
+ } else if ((pos = userAgent.indexOf("Netscape/9")) > -1) {
+ res[1] += "(NS9)";
+ res[2] += "(NS" + getVersionNumber(userAgent, pos + 9)
+ + ")";
+ } else {
+ res[1] += "(NS?)";
+ res[2] += "(NS?"
+ + getVersionNumber(userAgent,
+ userAgent.indexOf("Netscape/") + 9) + ")";
+ }
+ }
+ } else if ((pos = userAgent.indexOf("Netscape/")) > -1) {
+ if ((pos = userAgent.indexOf("Netscape/4")) > -1) {
+ res = ["NS", "NS4",
+ "NS" + getVersionNumber(userAgent, pos + 9)];
+ } else
+ res = ["NS", "NS?",
+ "NS?" + getVersionNumber(userAgent, pos + 9)];
+ } else if ((pos = userAgent.indexOf("Chrome/")) > -1) {
+ res = ["KHTML", "KHTML(Chrome)", "KHTML(Chrome"
+ + getVersionNumber(userAgent, pos + 6) + ")"];
+ } else if ((pos = userAgent.indexOf("Safari/")) > -1) {
+ res = ["KHTML", "KHTML(Safari)", "KHTML(Safari"
+ + getVersionNumber(userAgent, pos + 6) + ")"];
+ } else if ((pos = userAgent.indexOf("Konqueror/")) > -1) {
+ res = ["KHTML", "KHTML(Konqueror)", "KHTML(Konqueror"
+ + getVersionNumber(userAgent, pos + 9) + ")"];
+ } else if ((pos = userAgent.indexOf("KHTML")) > -1) {
+ res = ["KHTML", "KHTML?",
+ "KHTML?(" + getVersionNumber(userAgent, pos + 5) + ")"];
+ } else if ((pos = userAgent.indexOf("NetFront")) > -1) {
+ res = ["NetFront", "NetFront", "NetFront "
+ + getVersionNumber(userAgent, pos + 8)];
+ } else if ((pos = userAgent.indexOf("BlackBerry")) > -1) {
+ pos = userAgent.indexOf("/", pos + 2);
+ res = ["BlackBerry", "BlackBerry", "BlackBerry"
+ + getVersionNumber(userAgent, pos + 1)];
+ } else if (userAgent.indexOf("Mozilla/4.") == 0
+ && userAgent.indexOf("Mozilla/4.0") < 0
+ && userAgent.indexOf("Mozilla/4.5 ") < 0) {
+ // We will interpret Mozilla/4.x as Netscape Communicator is and only if
+ // x is not 0 or 5
+ res = ["Communicator", "Communicator", "Communicator"
+ + getVersionNumber(userAgent, pos + 8)];
+ } else
+ return ["?", "?", "?"];
+ return res;
+ }
+ }
+}
+
=======================================
--- /dev/null
+++ /trunk/flash-client/src/locale/ca_ES/DisplayMessages.properties Sun Feb 2 19:14:17 2014 UTC
@@ -0,0 +1,236 @@
+10gbps = subxarxa 10 Gbps 10 Gigabit Ethernet/OC-192
+10mbps = subxarxa 10 Mbps Ethernet
+10mins = 10 min
+12hours = 12 hores
+1day = 1 dia
+1gbps = subxarxa 1.0 Gbps Gigabit Ethernet
+1min = 1 min
+2.4gbps = subxarxa 2.4 Gbps OC-48
+2hours = 2 hores
+30mins = 30 min
+45mbps = subxarxa 45 Mbps T3/DS3
+5mins = 5 min
+622mbps = subxarxa a 622 Mbps OC-12
+and = and
+architecture = Arquitectura
+bytes = Bytes
+c2s = C2S
+c2sPacketQueuingDetected = [C2S]: Cua de paquets detectada
+c2sThroughput = C2S throughput
+c2sThroughputFailed = Test de C2S throughput FALLIT!
+cabledsl = Cable/DSL modem
+cablesNok = Advert\u00e8ncia: Excessius errors de xarxa, revisar cable(s) de xarxa
+cablesOk = Trobat bon(s) cable(s) de xarxa
+checkingFirewalls = Buscant Firewalls . . . . . . . . . . . . . . . . . . .
+checkingMiddleboxes = Buscant Caixes Intermitjes (Middleboxes) . . . . . . . . . . . . . . . . . .
+clickStart = Fes click a COMEN\u00e7AR per a comen\u00e7ar la prova
+clickStart2 = Fes click a COMEN\u00e7AR per a tornar a fer la prova
+client = Client
+client2 = Client
+clientAcksReport = Client Confirma l'enlla\u00e7 reportat \u00e9s
+clientDataReports = Dades de Client reporten que l'enlla\u00e7 \u00e9s
+clientInfo = Detalls del sistema client
+clientIpModified = Informaci\u00f3: El NAT (Network Address Translation) est\u00e0 modificant l'adre\u00e7a IP del client
+clientIpNotFound = No es troba l'adre\u00e7a del client. Per a usuaris d'Internet Explorer, modifiqui els par\u00e0metres de Java\n Click a Eines - Opcions d'Internet - Seguretat - Nivell personalitzat, trobi la l\u00ednia\n Microsoft VM - Java Permissions i faci click a personalitzar\ Editar permisos - Acc\u00e9s a totes les Adreces de xarxa, click a Habilitar i desar els canvis.
+clientIpPreserved = Les Adreces IP de servidor son conservades Extrem-a-Extrem
+clientSays = per\u00f2 el Client diu
+close = Tancar
+comments = Comentaris
+congestNo = No s'ha trobat congesti\u00f3 de xarxa
+congestYes = Informaci\u00f3: El throughput \u00e9s limitat per altre tr\u00e0fic de xarxa
+connIdle = La connexi\u00f3 estaba aturada
+connStalled = La connexi\u00f3 s'ha pausat
+connected = Connectat a:
+connectedTo = s'ha connectat a:
+copy = C\u00f2pia
+defaultTests = Proves per defecte
+delayBetweenTests = Retard entre proves
+detailedStats = Estad\u00edstiques detallades
+dialup = Modem telef\u00f2nic
+dialup2 = Trucada
+done = Fet.
+done2 = Tcpbw100 fet
+dupAcksIn = es reben ack's duplicats
+duplexFullHalf = Alarma: Condici\u00f3 doble no concordant detectada Switch=Full i Host=half
+duplexHalfFull = Alarma: Condici\u00f3 doble no concordant detectada Switch=half i Host=full
+duplexNok = Advert\u00e8ncia: Condici\u00f3 doble antiga no concordant antiga
+duplexOk = Operaci\u00f3 normal trobada (Normal duplex operation found.)
+endOfEmail = Final del missatge de Correu electr\u00f2nic
+excLoss = Exc\u00e9s de p\u00e8rdua de paquets est\u00e0 impactant al rendiment, prova la funci\u00f3 d'autonegociaci\u00f3 entre el teu PC i el switch de xarxa
+excessiveErrors = Alarma: Excessius errors, revisa el(s) cable(s) de xarxa.
+firewallNo = no est\u00e0 darrere un firewall. [Conexi\u00f3 al port ef\u00edmer correcte]
+firewallYes = est\u00e0 probablement darrere un firewall. [Conexi\u00f3 al port ef\u00edmer ha fallat]
+flowControlLimits = El control de fluxe basat en xarxa limita el throughput a
+found100mbps = Trobat enlla\u00e7 de 100 Mbps FastEthernet.
+found10gbps = Trobat enlla\u00e7 de 10 Gbps 10 GigEthernet/OC-192.
+found10mbps = Trobat enlla\u00e7 de 10 Mbps Ethernet.
+found1gbps = Trobat enlla\u00e7 de 1 Gbps GigabitEthernet.
+found2.4gbps = Trobat enlla\u00e7 de 2.4 Gbps OC-48.
+found45mbps = Trobat enlla\u00e7 de 45 Mbps T3/DS3.
+found622mbps = Trobat enlla\u00e7 de 622 Mbps OC-12.
+foundDialup = Trobat enlla\u00e7 de Dial-up modem.
+foundDsl = Trobat enlla\u00e7 de Cable modem/DSL/T1.
+fullDuplex = subxaxarxa Full duplex Fast Ethernet
+general = General
+generatingReport = Generant informe de problemes: Aquest informe s'enviar\u00e0 per e-mail a la persona que especifiquis
+getWeb100Var = Obt\u00e9 les variables WEB100
+halfDuplex = subxarxa Half duplex Fast Ethernet
+id = Eina de diagn\u00f2stic de xara TCP/Web100
+immediate = immediat
+inboundTest = Test d'entrada Tcpbw100...
+inboundWrongMessage = Test de throughput C2S: Rebut un tipus de missatge erroni
+incompatibleVersion = N\u00famero de versi\u00f3 incompatible
+incrRxBuf = Augmentant el valor del buffer de recepci\u00f3 del client
+incrTxBuf = Augmentant el buffer de sortida del servidor NDT
+information = Informaci\u00f3
+initialization = Inicialitzant...
+insufficient = No es disposa de prou dades per a determinar el tipus d'enlla\u00e7.
+invokingMailtoFunction = Invocant funci\u00f3 Mailto Tcpbw100
+ipProtocol = Protocol IP
+ipcFail = Fallen les comunicacions entre processos, tipus d'enlla\u00e7 desconegut.
+usingIpv4 = -- Utilitzant adre\u00e7a IPv4
+usingIpv6 = -- Utilitzant adre\u00e7a IPv6
+javaData = Dades Java
+kbyteBufferLimits = KByte buffer que limita el throughput a
+limitNet = Xarxa limitada
+limitRx = Receptor limitat
+limitTx = Emissor limitat
+linkFullDpx = Enlla\u00e7 establert al mode Full Duplex
+linkHalfDpx = Enlla\u00e7 establert al mode Half Duplex
+loggingWrongMessage = Logant al servidor: Es rep un tipus de missatge erroni.
+lookupError = Incapa\u00e7 d'obtenir la adre\u00e7a IP remota
+mboxWrongMessage = Test intermig: Rebut tipus de missatge erroni
+meta = META
+metaFailed = META test FAILED!
+metaTest = META test...
+metaWrongMessage = META test: Received wrong type of the message
+middlebox = Middlebox
+middleboxFail = El servidor ha fallat mentre es provaba la middlebox
+middleboxFail2 = test Middlebox FALLA!
+middleboxModifyingMss = Informaci\u00f3: La middlebox de xarxa est\u00e0 modificant la variable MSS
+middleboxTest = Test de Middlebox Tcpbw100...
+moreDetails = M\u00e9s detalls...
+name = Nom
+ndtServerHas = El servidor NDT t\u00e9 un
+noPktLoss1 = No hi ha p\u00e8rdua de paquets
+noPktLoss2 = No s'aprecia cap p\u00e8rdua de paquets
+numberOfTests = Nombre de proves
+of = de
+off = OFF
+ok = OK
+oldDuplexMismatch = "Advert\u00e8ncia: Es detecta antiga condici\u00f3 doble no concordant"
+on = ON
+ooOrder = per\u00f2 els paquets han arribat desordenats
+options = Opcions
+osData = dades del SO:
+otherClient = S'est\u00e0 servint un altre client, la seva prova comen\u00e7ar\u00e0 en
+otherTraffic = Informaci\u00f3: L'enlla\u00e7 de xarxa est\u00e0 congestionat per algun altre tr\u00e0fic
+outboundTest = Test de sortida Tcpbw100...
+outboundWrongMessage = Test de throughput C2S: Es rep un tipus de missatge erroni
+packetQueuing = Posant paquets en cua
+packetQueuingInfo = TCP (Transmission Control Protocol) transfereix dades entre dos\n equips d'internet. Autom\u00e0ticament detecta i es recupera d'errors i p\u00e8rdues./n TCP utilitza buffers per a proporcionar aquesta confiabilitat. Adem\u00e9s,\n els switch i routers
+utilitzen buffers per aquells casos en que m\u00faltiples enlla\u00e7os d'entrada\n envien paquets a un \u00fanic enlla\u00e7 de sortida o si varien les velocitats de cada enlla\u00e7\n (FastEthernet a modem DSL).\n\n El servidor NDT genera i envia 10 segons de dades al client. En\n alguns casos el servidor pot generar les dades m\u00e9s de pressa del que pot enviar els paquets a la xarxa\n (p.ex., una CPU a 2 GHz enviant a un client conectat a una DSL).\n Quan passa aix\u00f2, alguns paquets es poden quedar a la cua de sortida /n quan s'acaba el temporitzador de 10 segons.\n El TCP continuar\u00e0 enviant automaticament aquests missatges a la cua i el client continuar\u00e0 acceptant-los i processant-los.\n Aix\u00f2 provoca que una prova duri m\u00e9s del que s'espera.\n\n Aquesta condici\u00f3 s'ha produït durant aquesta prova. /n No es requereix cap acci\u00f3 per a resoldre aquesta situaci\u00f3.
+packetSizePreserved = La mida del paquet \u00e9s prefixada Extrem-a-Extrem
+packetsize = la mida de paquet
+pc = PC
+pctOfTime = % del temps
+performedTests = Proves realitzades
+pktsRetrans = Paquets retransmesos
+possibleDuplexFullHalf = Alarma: Possible Condici\u00f3 doble no concordant detectada Switch=Full i Host=half
+possibleDuplexHalfFull = Alarma: Possible Condici\u00f3 doble no concordant detectada Switch=half i Host=full
+possibleDuplexHalfFullWarning = Advert\u00e8ncia: Possible Condici\u00f3 doble no concordant detectada Switch=half i Host=full
+preferIPv6 = prefereix IPv6
+printDetailedStats = Imprimir Estad\u00edstiques detallades
+protocolError = Error de Protocol! S'esperava 'prepare', s'obt\u00e9: 0x
+qSeen = Test de throughput: Detectat encuament de paquets
+ready = Tcpbw100 llest
+receiveBufferShouldBe = Informaci\u00f3: El buffer de recepci\u00f3 hauria de ser
+receiving = Rebent resultats...
+reportProblem = Informar el problema
+resultsParseError = Error en transformar els resultats del test!
+resultsTimeout = Alerta! Time-out al client mentre es llegien dades, (possible duplex mismatch exists)
+resultsWrongMessage = Resultats del test: S'ha rebut un tipus de missatge incorrecte
+rtt = RTT
+rttFail = L'algorisme del link de detecci\u00f3 ha fallat degut a excessius temps d'anada i tornada (Round trip times).
+runningInboundTest = executant test d'entrada de 10s (server-a-client [S2C]) . . . . . .
+runningOutboundTest = executant test de sortida de 10s (client-a-server [C2S]) . . . . .
+s2c = S2C
+s2cPacketQueuingDetected = [S2C]: Encuament de paquets detectat
+s2cThroughput = Throughput S2C
+s2cThroughputFailed = El test de throughput S2C ha FALLAT!
+sackReceived = Blocs SACK rebuts
+scalingFactors = Factors d'Escala
+seconds = segons
+sendingMetaInformation = Sending META information . . . . . . . . . . . . . . . . . . .
+server = Servidor
+serverAcksReport = El servidor confirma que l'enlla\u00e7 reportat \u00e9s
+serverFault = Fallida de Servidor: Error desconegut. Torneu-ho a provar m\u00e9s tard, si us plau.
+serverBusy = Servidor Ocupat: Massa clients esperant a la cua del servidor. Torneu-ho a provar m\u00e9s tard, si us plau.
+serverBusy15s = Servidor Ocupat: Esperi 15 segons per a la finalitzaci\u00f3 del test anterior.
+serverBusy30s = Servidor Ocupat: Esperi 30 segons per a la finalitzaci\u00f3 del test anterior.
+serverBusy60s = Servidor Ocupat: Esperi 60 segons per a la finalitzaci\u00f3 del test anterior.
+serverDataReports = Les dades del servidor indiquen que l'enlla\u00e7 \u00e9s
+serverFail = El servidor ha fallat mentre es rebien dades
+serverIpModified = Informaci\u00f3: El Network Address Translation (NAT) est\u00e0 modificant l'adre\u00e7a IP del client
+serverIpPreserved = L'adre\u00e7a IP del servidor es mant\u00e9 Extrem-a-Extrem
+serverNotRunning = Proc\u00e9s del servidor no funcionant: Arrenqui el proc\u00e9s web100srv al servidor remot.
+serverSays = El servidor diu
+sfwFail = Test de firewall simple FALLA!
+sfwSocketFail = Simple firewall test: Cannot create listen socket
+sfwTest = Simple firewall test...
+sfwWrongMessage = Test de firewall simple: S'ha rebut un missatge erroni.
+showOptions = Mostra les opcions
+simpleFirewall = Firewall simple
+sleep10m = Dormint per 10 mins...
+sleep1m = Dormint per 1 min...
+sleep30m = Dormint per 30 mins...
+sleep5m = Dormint per 5 mins...
+sleep12h = Dormint per 12 hores...
+sleep1d = Dormint per 1 d\u00eda...
+sleep2h = Dormint per 2 hores...
+start = COMEN\u00e7A
+startingTest = Comen\u00e7ant test
+statistics = Estad\u00edstiques
+stop = ATURA
+stopped = Les proves han estat aturades!
+stopping = Aturant...
+systemFault = Fallada de sistema
+test = Prova
+testsuiteWrongMessage = Negociant s\u00e8rie de proves: S'ha rebut un missatge erroni.
+theSlowestLink = El link m\u00e9s lent al cam\u00ed extrem a extrem \u00e9s un
+theoreticalLimit = El l\u00edmit te\u00f2ric de xarxa \u00e9s
+thisConnIs = Aquesta connexi\u00f3 \u00e9s
+timesPktLoss = temps degut a p\u00e8rdua de paquets
+toMaximizeThroughput = kbytes per a maximitzar el cabdal (throughput)
+troubleReportFrom = Informe de problemes de NDT a
+unableToDetectBottleneck = El servidor no pot determinar el tipus d'enlla\u00e7 que provoca el coll d'ampolla.
+unableToObtainIP = No es possible determinar la adre\u00e7a IP local
+unknownID = ID de test desconegut
+unknownServer = Servidor desconegut
+unsupportedClient = Informaci\u00f3: El servidor no suporta aquest client de l\u00ednia de comandes
+vendor = Fabricant
+version = Versi\u00f3
+versionWrongMessage = Negociant la versi\u00f3 de NDT: S'ha rebut un missatge erroni.
+web100Details = An\u00e0lisi detallat Web100
+web100KernelVar = Variables de Kernel WEB100
+web100Stats = Estad\u00edstiques WEB100 habilitades
+web100Var = Variables Web100
+web100rtt = Web100 informa el temps d'anada i tornada (RTT)
+web100tcpOpts = Web100 informa que TCP ha negociat els par\u00e0metres de funcionament \u00f2ptims a:
+willImprove = Millorar\u00e0 el funcionament
+workstation = Estaci\u00f3 de treball
+your = El seu
+yourPcHas = El seu PC/Equip de treball t\u00e9 un
+connectingTo = Connectant a
+toRunTest = executar prova
+t1Str = T1
+t3Str = T3;
+ethernetStr = Ethernet
+fastEthernet = FastE
+oc12Str = OC-12
+gigabitEthernetStr = GigE
+oc48Str = OC-48
+tengigabitEthernetStr = 10 Gig
+systemFaultStr = systemFault
+dialupStr = dialup2
+rttStr = rtt
=======================================
--- /dev/null
+++ /trunk/flash-client/src/locale/el_GR/DisplayMessages.properties Sun Feb 2 19:14:17 2014 UTC
@@ -0,0 +1,235 @@
+10gbps = \u03c5\u03c0\u03bf\u03b4\u03af\u03ba\u03c4\u03c5\u03bf \u03c4\u03cd\u03c0\u03bf\u03c5 10 Gbps 10 Gigabit Ethernet/OC-192
+10mbps = \u03c5\u03c0\u03bf\u03b4\u03af\u03ba\u03c4\u03c5\u03bf \u03c4\u03cd\u03c0\u03bf\u03c5 10 Mbps Ethernet
+10mins = 10 \u03bb\u03b5\u03c0\u03c4\u03ac
+12hours = 12 \u03ce\u03c1\u03b5\u03c2
+1day = 1 \u03bc\u03ad\u03c1\u03b1
+1gbps = \u03c5\u03c0\u03bf\u03b4\u03af\u03ba\u03c4\u03c5\u03bf \u03c4\u03cd\u03c0\u03bf\u03c5 1.0 Gbps Gigabit Ethernet
+1min = 1 \u03bb\u03b5\u03c0\u03c4\u03cc
+2.4gbps = \u03c5\u03c0\u03bf\u03b4\u03af\u03ba\u03c4\u03c5\u03bf \u03c4\u03cd\u03c0\u03bf\u03c5 2.4 Gbps OC-48
+2hours = 2 \u03ce\u03c1\u03b5\u03c2
+30mins = 30 \u03bb\u03b5\u03c0\u03c4\u03ac
+45mbps = \u03c5\u03c0\u03bf\u03b4\u03af\u03ba\u03c4\u03c5\u03bf \u03c4\u03cd\u03c0\u03bf\u03c5 45 Mbps T3/DS3
+5mins = 5 \u03bb\u03b5\u03c0\u03c4\u03ac
+622mbps = \u03c5\u03c0\u03bf\u03b4\u03af\u03ba\u03c4\u03c5\u03bf \u03c4\u03cd\u03c0\u03bf\u03c5 622 Mbps OC-12
+and = \u03ba\u03b1\u03b9
+architecture = \u0391\u03c1\u03c7\u03b9\u03c4\u03b5\u03ba\u03c4\u03bf\u03bd\u03b9\u03ba\u03ae
+bytes = Bytes
+c2s = \u03c0\u03b5\u03bb\u03ac\u03c4\u03b7\u03c2-\u03c0\u03c1\u03bf\u03c2-\u03b5\u03be\u03c5\u03c0\u03b7\u03c1\u03b5\u03c4\u03b7\u03c4\u03ae
+c2sPacketQueuingDetected = [C2S]: \u0391\u03bd\u03b9\u03c7\u03bd\u03b5\u03cd\u03c4\u03b7\u03ba\u03b5 \u03cc\u03c4\u03b9 \u03c4\u03b1 \u03c0\u03b1\u03ba\u03ad\u03c4\u03b1 \u03bc\u03c0\u03b1\u03af\u03bd\u03bf\u03c5\u03bd \u03c3\u03b5 \u03bf\u03c5\u03c1\u03ac
+c2sThroughput = \u03c4\u03b1\u03c7\u03cd\u03c4\u03b7\u03c4\u03b1 \u03b4\u03b9\u03b1\u03bc\u03b5\u03c4\u03b1\u03b3\u03c9\u03b3\u03ae\u03c2 \u03b1\u03c0\u03cc \u03c4\u03bf\u03bd \u03c0\u03b5\u03bb\u03ac\u03c4\u03b7 \u03c3\u03c4\u03bf\u03bd \u03b5\u03be\u03c5\u03c0\u03b7\u03c1\u03b5\u03c4\u03b7\u03c4\u03ae
+c2sThroughputFailed = \u03bc\u03ad\u03c4\u03c1\u03b7\u03c3\u03b7 \u03c4\u03b1\u03c7\u03cd\u03c4\u03b7\u03c4\u03b1\u03c2 \u03b4\u03b9\u03b1\u03bc\u03b5\u03c4\u03b1\u03b3\u03c9\u03b3\u03ae\u03c2 \u03b1\u03c0\u03cc \u03c4\u03bf\u03bd \u03c0\u03b5\u03bb\u03ac\u03c4\u03b7 \u03c3\u03c4\u03bf\u03bd \u03b5\u03be\u03c5\u03c0\u03b7\u03c1\u03b5\u03c4\u03b7\u03c4\u03ae \u0391\u03a0\u0395\u03a4\u03a5\u03a7\u0395!
+cabledsl = Cable/DSL modem
+cablesNok = \u03a0\u03c1\u03bf\u03b5\u03b9\u03b4\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7: \u03c5\u03c0\u03b5\u03c1\u03b2\u03bf\u03bb\u03b9\u03ba\u03ac \u03c0\u03bf\u03bb\u03bb\u03ac \u03bb\u03ac\u03b8\u03b7 \u03b4\u03b9\u03ba\u03c4\u03cd\u03bf\u03c5, \u03b5\u03bb\u03ad\u03b3\u03be\u03c4\u03b5 \u03c4\u03bf \u03ba\u03b1\u03bb\u03ce\u03b4\u03b9\u03bf(\u03b1) \u03c4\u03bf\u03c5 \u03b4\u03b9\u03ba\u03c4\u03cd\u03bf\u03c5
+cablesOk = \u039a\u03b1\u03bb\u03ce\u03b4\u03b9\u03bf(\u03b1) \u03b4\u03b9\u03ba\u03c4\u03cd\u03bf\u03c5 \u03b5\u03bd\u03c4\u03ac\u03be\u03b5\u03b9
+checkingFirewalls = \u0388\u03bb\u03b5\u03b3\u03c7\u03bf\u03c2 \u03b3\u03b9\u03b1 firewalls . . . . . . . . . . . . . . . . . . .
+checkingMiddleboxes = \u0388\u03bb\u03b5\u03b3\u03c7\u03bf\u03c2 \u03b3\u03b9\u03b1 \u03b5\u03bd\u03b4\u03b9\u03ac\u03bc\u03b5\u03c3\u03bf\u03c5\u03c2 \u03ba\u03cc\u03bc\u03b2\u03bf\u03c5\u03c2 . . . . . . . . . . . . . . . . . .
+clickStart = \u03a0\u03b9\u03ad\u03c3\u03c4\u03b5 \u0395\u039d\u0391\u03a1\u039e\u0397 \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03be\u03b5\u03ba\u03b9\u03bd\u03ae\u03c3\u03b5\u03c4\u03b5 \u03c4\u03b7 \u03bc\u03ad\u03c4\u03c1\u03b7\u03c3\u03b7
+clickStart2 = \u03a0\u03b9\u03ad\u03c3\u03c4\u03b5 \u0395\u039d\u0391\u03a1\u039e\u0397 \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03be\u03b1\u03bd\u03b1\u03be\u03b5\u03ba\u03b9\u03bd\u03ae\u03c3\u03b5\u03c4\u03b5 \u03c4\u03b7 \u03bc\u03ad\u03c4\u03c1\u03b7\u03c3\u03b7
+client = \u039f \u03c0\u03b5\u03bb\u03ac\u03c4\u03b7\u03c2
+client2 = \u039f \u03c0\u03b5\u03bb\u03ac\u03c4\u03b7\u03c2
+clientAcksReport = \u03a4\u03b1 Acks \u03c4\u03bf\u03c5 \u03c0\u03b5\u03bb\u03ac\u03c4\u03b7 \u03b4\u03b5\u03af\u03c7\u03bd\u03bf\u03c5\u03bd \u03cc\u03c4\u03b9 \u03b7 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7 \u03b5\u03af\u03bd\u03b1\u03b9
+clientDataReports = \u03a4\u03b1 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03b1 \u03c4\u03bf\u03c5 \u03c0\u03b5\u03bb\u03ac\u03c4\u03b7 \u03b4\u03b5\u03af\u03c7\u03bd\u03bf\u03c5\u03bd \u03cc\u03c4\u03b9 \u03b7 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7 \u03b5\u03af\u03bd\u03b1\u03b9
+clientInfo = \u039b\u03b5\u03c0\u03c4\u03bf\u03bc\u03ad\u03c1\u03b5\u03b9\u03b5\u03c2 \u03c3\u03c5\u03c3\u03c4\u03ae\u03bc\u03b1\u03c4\u03bf\u03c2 \u03c0\u03b5\u03bb\u03ac\u03c4\u03b7
+clientIpModified = \u03a0\u03bb\u03b7\u03c1\u03bf\u03c6\u03bf\u03c1\u03af\u03b1: \u039a\u03ac\u03c0\u03bf\u03b9\u03b1 \u03c3\u03c5\u03c3\u03ba\u03b5\u03c5\u03ae \u03bc\u03b5 Network Address Translation (NAT) \u03c4\u03c1\u03bf\u03c0\u03bf\u03c0\u03bf\u03b9\u03b5\u03af \u03c4\u03b7\u03bd \u03b4\u03b9\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7 IP \u03c4\u03bf\u03c5 \u03c0\u03b5\u03bb\u03ac\u03c4\u03b7
+clientIpNotFound = \u0397 \u03b4\u03b9\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7 IP \u03c4\u03bf\u03c5 \u03c0\u03b5\u03bb\u03ac\u03c4\u03b7 \u03b4\u03b5\u03bd \u03b2\u03c1\u03ad\u03b8\u03b7\u03ba\u03b5. \u0393\u03b9\u03b1 \u03c7\u03c1\u03ae\u03c3\u03c4\u03b5\u03c2 Internet Explorer, \u03c0\u03b1\u03c1\u03b1\u03ba\u03b1\u03bb\u03ce \u03c4\u03c1\u03bf\u03c0\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03c4\u03b5 \u03c4\u03b9\u03c2 \u03c0\u03b1\u03c1\u03b1\u03bc\u03ad\u03c4\u03c1\u03bf\u03c5\u03c2 \u03c4\u03b7\u03c2 Java \n \u03ba\u03ac\u03bd\u03c4\u03b5 \u03ba\u03bb\u03b9\u03ba \u03c3\u03c4\u03bf Tools - Internet Options - Security - Custom Level, \u03c0\u03b7\u03b3\u03b1\u03af\u03bd\u03b5\u03c4\u03b5 \u03c3\u03c4\u03bf\n Microsoft VM - Java permissions, \u03ba\u03bb\u03b9\u03ba \u03c3\u03c4\u03bf Custom, \u03ba\u03bb\u03b9\u03ba \u03c3\u03c4\u03bf Java Custom Settings\n Edit Permissions - Access to all Network Addresses, \u03ba\u03ac\u03bd\u03c4\u03b5 \u03ba\u03bb\u03b9\u03ba \u03c3\u03c4\u03bf Enable \u03ba\u03b1\u03b9 \u03bc\u03b5\u03c4\u03ac \u03c3\u03ce\u03c3\u03c4\u03b5
+clientIpPreserved = \u039f\u03b9 \u03b4\u03b9\u03b5\u03c5\u03b8\u03cd\u03bd\u03c3\u03b5\u03b9\u03c2 \u03c4\u03bf\u03c5 \u03b5\u03be\u03c5\u03c0\u03b7\u03c1\u03b5\u03c4\u03b7\u03c4\u03ae \u03b4\u03b9\u03b1\u03c4\u03b7\u03c1\u03bf\u03cd\u03bd\u03c4\u03b1\u03b9 \u03b1\u03c0\u03cc \u03ac\u03ba\u03c1\u03bf \u03c3\u03b5 \u03ac\u03ba\u03c1\u03bf
+clientSays = \u03b1\u03bb\u03bb\u03ac \u03bf \u03c0\u03b5\u03bb\u03ac\u03c4\u03b7\u03c2 \u03bb\u03ad\u03b5\u03b9
+close = \u039a\u03bb\u03b5\u03af\u03c3\u03b9\u03bc\u03bf
+comments = \u03a3\u03c7\u03cc\u03bb\u03b9\u03b1
+congestNo = \u0394\u03b5\u03bd \u03b1\u03bd\u03b9\u03c7\u03bd\u03b5\u03cd\u03b8\u03b7\u03ba\u03b5 \u03c3\u03c5\u03bc\u03c6\u03cc\u03c1\u03b7\u03c3\u03b7 \u03c3\u03c4\u03bf \u03b4\u03af\u03ba\u03c4\u03c5\u03bf.
+congestYes = \u03a0\u03bb\u03b7\u03c1\u03bf\u03c6\u03bf\u03c1\u03af\u03b1: \u03b7 \u03c4\u03b1\u03c7\u03cd\u03c4\u03b7\u03c4\u03b1 \u03b4\u03b9\u03b1\u03bc\u03b5\u03c4\u03b1\u03b3\u03c9\u03b3\u03ae\u03c2 \u03c0\u03b5\u03c1\u03b9\u03bf\u03c1\u03af\u03b6\u03b5\u03c4\u03b1\u03b9 \u03b1\u03c0\u03cc \u03ac\u03bb\u03bb\u03b7\u03c2 \u03c0\u03c1\u03bf\u03ad\u03bb\u03b5\u03c5\u03c3\u03b7\u03c2 \u03ba\u03af\u03bd\u03b7\u03c3\u03b7 \u03bc\u03ad\u03c3\u03b1 \u03c3\u03c4\u03bf \u03b4\u03af\u03ba\u03c4\u03c5\u03bf.
+connIdle = \u0397 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7 \u03ae\u03c4\u03b1\u03bd \u03b1\u03bd\u03b5\u03bd\u03b5\u03c1\u03b3\u03ae
+connStalled = \u0397 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7 \u03c5\u03c0\u03ad\u03c3\u03c4\u03b7 \u03ba\u03ac\u03c0\u03bf\u03b9\u03b1 \u03ba\u03b1\u03b8\u03c5\u03c3\u03c4\u03ad\u03c1\u03b7\u03c3\u03b7
+connected = \u03a3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7 \u03c3\u03c4\u03bf:
+connectedTo = \u03b5\u03af\u03bd\u03b1\u03b9 \u03c3\u03c5\u03bd\u03b4\u03b5\u03b4\u03b5\u03bc\u03ad\u03bd\u03bf \u03c3\u03b5
+copy = \u0391\u03bd\u03c4\u03b9\u03b3\u03c1\u03b1\u03c6\u03ae
+defaultTests = \u0395\u03be'\u03bf\u03c1\u03b9\u03c3\u03bc\u03bf\u03cd \u03bc\u03b5\u03c4\u03c1\u03ae\u03c3\u03b5\u03b9\u03c2
+delayBetweenTests = \u03ba\u03b1\u03b8\u03c5\u03c3\u03c4\u03ad\u03c1\u03b7\u03c3\u03b7 \u03b1\u03bd\u03ac\u03bc\u03b5\u03c3\u03b1 \u03c3\u03c4\u03b9\u03c2 \u03bc\u03b5\u03c4\u03c1\u03ae\u03c3\u03b5\u03b9\u03c2
+detailedStats = \u039b\u03b5\u03c0\u03c4\u03bf\u03bc\u03b5\u03c1\u03b5\u03af\u03c2 \u03c3\u03c4\u03b1\u03c4\u03b9\u03c3\u03c4\u03b9\u03ba\u03ad\u03c2
+dialup = Dial-up Modem
+dialup2 = Dial-up
+done = \u039f\u03bb\u03bf\u03ba\u03bb\u03b7\u03c1\u03ce\u03b8\u03b7\u03ba\u03b5.
+done2 = \u03a4\u03bf Tcpbw100 \u03bf\u03bb\u03bf\u03ba\u03bb\u03ae\u03c1\u03c9\u03c3\u03b5
+dupAcksIn = duplicate acks \u03b5\u03bb\u03ae\u03c6\u03b8\u03b7\u03c3\u03b1\u03bd
+duplexFullHalf = \u03a0\u03c1\u03bf\u03c3\u03bf\u03c7\u03ae: \u03b1\u03bd\u03b1\u03bd\u03c4\u03b9\u03c3\u03c4\u03bf\u03b9\u03c7\u03af\u03b1 \u03c3\u03c4\u03b7\u03bd \u03b4\u03b9\u03b1\u03bc\u03cc\u03c1\u03c6\u03c9\u03c3\u03b7 duplex Switch=Full and Host=half
+duplexHalfFull = \u03a0\u03c1\u03bf\u03c3\u03bf\u03c7\u03ae: \u03b1\u03bd\u03b1\u03bd\u03c4\u03b9\u03c3\u03c4\u03bf\u03b9\u03c7\u03af\u03b1 \u03c3\u03c4\u03b7\u03bd \u03b4\u03b9\u03b1\u03bc\u03cc\u03c1\u03c6\u03c9\u03c3\u03b7 duplex Switch=half and Host=full
+duplexNok = \u03a0\u03c1\u03bf\u03c3\u03bf\u03c7\u03ae! \u03c0\u03b9\u03b8\u03b1\u03bd\u03ae \u03b1\u03bd\u03b1\u03bd\u03c4\u03b9\u03c3\u03c4\u03bf\u03b9\u03c7\u03af\u03b1 \u03c3\u03c4\u03b7\u03bd \u03b4\u03b9\u03b1\u03bc\u03cc\u03c1\u03c6\u03c9\u03c3\u03b7 duplex \u03bc\u03b5 \u03b2\u03ac\u03c3\u03b7 \u03c4\u03b7\u03bd \u03c0\u03b1\u03bb\u03b9\u03ac \u03c3\u03c5\u03bd\u03b8\u03ae\u03ba\u03b7:
+duplexOk = \u0392\u03c1\u03ad\u03b8\u03b7\u03ba\u03b5 \u03ba\u03b1\u03bd\u03bf\u03bd\u03b9\u03ba\u03ae \u03b4\u03b9\u03b1\u03bc\u03cc\u03c1\u03c6\u03c9\u03c3\u03b7 duplex.
+endOfEmail = \u03a4\u03ad\u03bb\u03bf\u03c2 \u03bc\u03b7\u03bd\u03cd\u03bc\u03b1\u03c4\u03bf\u03c2
+excLoss = \u03a5\u03c0\u03b5\u03c1\u03b2\u03bf\u03bb\u03b9\u03ba\u03ae \u03b1\u03c0\u03ce\u03bb\u03b5\u03b9\u03b1 \u03c0\u03b1\u03ba\u03ad\u03c4\u03c9\u03bd \u03bc\u03b5\u03b9\u03ce\u03bd\u03b5\u03b9 \u03c4\u03b9\u03c2 \u03b5\u03c0\u03b9\u03b4\u03cc\u03c3\u03b5\u03b9\u03c2 \u03c3\u03b1\u03c2, \u03b5\u03bb\u03ad\u03be\u03c4\u03b5 \u03c4\u03b7\u03bd \u03bb\u03b5\u03b9\u03c4\u03bf\u03c5\u03c1\u03b3\u03af\u03b1 auto-negotiate \u03c3\u03c4\u03bf\u03bd \u03c5\u03c0\u03bf\u03bb\u03bf\u03b3\u03b9\u03c3\u03c4\u03ae \u03ba\u03b1\u03b9 \u03c4\u03bf switch \u03c3\u03b1\u03c2
+excessiveErrors = \u03a0\u03c1\u03bf\u03c3\u03bf\u03c7\u03ae: \u03c5\u03c0\u03b5\u03c1\u03b2\u03bf\u03bb\u03b9\u03ba\u03ac \u03c0\u03bf\u03bb\u03bb\u03ac \u03bb\u03ac\u03b8\u03b7, \u03b5\u03bb\u03ad\u03b3\u03be\u03c4\u03b5 \u03c4\u03bf \u03ba\u03b1\u03bb\u03ce\u03b4\u03b9\u03bf(\u03b1) \u03c4\u03bf\u03c5 \u03b4\u03b9\u03ba\u03c4\u03cd\u03bf\u03c5.
+firewallNo = \u03b4\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03c0\u03af\u03c3\u03c9 \u03b1\u03c0\u03cc firewall. [\u0397 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7 \u03c3\u03c4\u03bf \u03b5\u03c6\u03ae\u03bc\u03b5\u03c1\u03bf port \u03c0\u03ad\u03c4\u03c5\u03c7\u03b5]
+firewallYes = \u03bc\u03ac\u03bb\u03bb\u03bf\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03c0\u03af\u03c3\u03c9 \u03b1\u03c0\u03cc firewall. [\u0397 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7 \u03c3\u03c4\u03bf \u03b5\u03c6\u03ae\u03bc\u03b5\u03c1\u03bf port \u03b1\u03c0\u03ad\u03c4\u03c5\u03c7\u03b5]
+flowControlLimits = \u039f \u03ad\u03bb\u03b5\u03b3\u03c7\u03bf\u03c2 \u03c1\u03bf\u03ae\u03c2 \u03c3\u03c4\u03bf \u03b4\u03af\u03ba\u03c4\u03c5\u03bf \u03c0\u03b5\u03c1\u03b9\u03bf\u03c1\u03af\u03b6\u03b5\u03b9 \u03c4\u03b7\u03bd \u03c4\u03b1\u03c7\u03cd\u03c4\u03b7\u03c4\u03b1 \u03b4\u03b9\u03b1\u03bc\u03b5\u03c4\u03b1\u03b3\u03c9\u03b3\u03ae\u03c2 \u03c3\u03c4\u03b1
+found100mbps = \u03b2\u03c1\u03ad\u03b8\u03b7\u03ba\u03b5 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7 100 Mbps FastEthernet.
+found10gbps = \u03b2\u03c1\u03ad\u03b8\u03b7\u03ba\u03b5 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7 10 Gbps 10 GigEthernet/OC-192.
+found10mbps = \u03b2\u03c1\u03ad\u03b8\u03b7\u03ba\u03b5 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7 10 Mbps Ethernet.
+found1gbps = \u03b2\u03c1\u03ad\u03b8\u03b7\u03ba\u03b5 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7 1 Gbps GigabitEthernet.
+found2.4gbps = \u03b2\u03c1\u03ad\u03b8\u03b7\u03ba\u03b5 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7 2.4 Gbps OC-48.
+found45mbps = \u03b2\u03c1\u03ad\u03b8\u03b7\u03ba\u03b5 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7 45 Mbps T3/DS3.
+found622mbps = \u03b2\u03c1\u03ad\u03b8\u03b7\u03ba\u03b5 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7 622 Mbps OC-12.
+foundDialup = \u03b2\u03c1\u03ad\u03b8\u03b7\u03ba\u03b5 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7 Dial-up modem.
+foundDsl = \u03b2\u03c1\u03ad\u03b8\u03b7\u03ba\u03b5 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7 Cable modem/DSL/T1.
+fullDuplex = \u03c5\u03c0\u03bf\u03b4\u03af\u03ba\u03c4\u03c5\u03bf Full duplex Fast Ethernet
+general = \u0393\u03b5\u03bd\u03b9\u03ba\u03ac
+generatingReport = \u03a0\u03b1\u03c1\u03b1\u03b3\u03c9\u03b3\u03ae \u03b4\u03b5\u03bb\u03c4\u03af\u03bf\u03c5 \u03c0\u03c1\u03bf\u03b2\u03bb\u03ae\u03bc\u03b1\u03c4\u03bf\u03c2: \u0391\u03c5\u03c4\u03ae \u03b7 \u03b1\u03bd\u03b1\u03c6\u03bf\u03c1\u03ac \u03b8\u03b1 \u03c4\u03b1\u03c7\u03c5\u03b4\u03c1\u03bf\u03bc\u03b7\u03b8\u03b5\u03af \u03c3\u03c4\u03bf \u03c0\u03c1\u03cc\u03c3\u03c9\u03c0\u03bf \u03c0\u03bf\u03c5 \u03b8\u03b1 \u03b5\u03c0\u03b9\u03bb\u03ad\u03be\u03b5\u03c4\u03b5
+getWeb100Var = Get WEB100 Variables
+halfDuplex = \u03c5\u03c0\u03bf\u03b4\u03af\u03ba\u03c4\u03c5\u03bf Half duplex Fast Ethernet
+id = TCP/Web100 \u0395\u03c1\u03b3\u03b1\u03bb\u03b5\u03af\u03bf \u0394\u03b9\u03ac\u03b3\u03bd\u03c9\u03c3\u03b7\u03c2 \u0394\u03b9\u03ba\u03c4\u03cd\u03bf\u03c5
+immediate = \u03b1\u03bc\u03ad\u03c3\u03c9\u03c2
+inboundTest = Tcpbw100 \u03b4\u03bf\u03ba\u03b9\u03bc\u03ae \u03b5\u03b9\u03c3\u03b5\u03c1\u03c7\u03cc\u03bc\u03b5\u03bd\u03b7\u03c2 \u03ba\u03af\u03bd\u03b7\u03c3\u03b7\u03c2...
+inboundWrongMessage = \u0394\u03bf\u03ba\u03b9\u03bc\u03ae: \u03c4\u03b1\u03c7\u03cd\u03c4\u03b7\u03c4\u03b1 \u03b4\u03b9\u03b1\u03bc\u03b5\u03c4\u03b1\u03b3\u03c9\u03b3\u03ae\u03c2 \u03b1\u03c0\u03cc \u03c0\u03b5\u03bb\u03ac\u03c4\u03b7 \u03c0\u03c1\u03bf\u03c2 \u03b5\u03be\u03c5\u03c0\u03b7\u03c1\u03b5\u03c4\u03b7\u03c4\u03ae: \u039b\u03ac\u03b2\u03b1\u03bc\u03b5 \u03bb\u03ac\u03b8\u03bf\u03c2 \u03c4\u03cd\u03c0\u03bf \u03bc\u03b7\u03bd\u03cd\u03bc\u03b1\u03c4\u03bf\u03c2
+incompatibleVersion = \u0391\u03c3\u03cd\u03bc\u03b2\u03b1\u03c4\u03bf\u03c2 \u03b1\u03c1\u03b9\u03b8\u03bc\u03cc\u03c2 \u03ad\u03ba\u03b4\u03bf\u03c3\u03b7\u03c2
+incrRxBuf = \u0391\u03cd\u03be\u03b7\u03c3\u03b7 \u03c4\u03bf\u03c5 buffer \u03bb\u03ae\u03c8\u03b7\u03c2 \u03c4\u03bf\u03c5 \u03c0\u03b5\u03bb\u03ac\u03c4\u03b7
+incrTxBuf = \u0391\u03cd\u03be\u03b7\u03c3\u03b7 \u03c4\u03bf\u03c5 buffer \u03b1\u03c0\u03bf\u03c3\u03c4\u03bf\u03bb\u03ae\u03c2 \u03c4\u03bf\u03c5 \u03b5\u03be\u03c5\u03c0\u03b7\u03c1\u03b5\u03c4\u03b7\u03c4\u03ae NDT
+information = \u03a0\u03bb\u03b7\u03c1\u03bf\u03c6\u03bf\u03c1\u03af\u03b5\u03c2
+initialization = \u0391\u03c1\u03c7\u03b9\u03ba\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7...
+insufficient = \u0391\u03bd\u03b5\u03c0\u03b1\u03c1\u03ba\u03ae \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03b1 \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03c7\u03b1\u03c1\u03b1\u03ba\u03c4\u03b7\u03c1\u03b9\u03c3\u03c4\u03b5\u03af \u03bf \u03c4\u03cd\u03c0\u03bf\u03c2 \u03c4\u03b7\u03c2 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7\u03c2.
+invokingMailtoFunction = Tcpbw100 Invoking Mailto function
+ipProtocol = \u03c0\u03c1\u03c9\u03c4\u03cc\u03ba\u03bf\u03bb\u03bb\u03bf IP
+ipcFail = Interprocess communications failed, unknown link type.
+usingIpv4 = -- \u03a7\u03c1\u03b7\u03c3\u03b9\u03bc\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7 \u03b4\u03b9\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7\u03c2 IPv4
+usingIpv6 = -- \u03a7\u03c1\u03b7\u03c3\u03b9\u03bc\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7 \u03b4\u03b9\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7\u03c2 IPv6
+javaData = \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03b1 Java
+kbyteBufferLimits = KByte buffer \u03c0\u03bf\u03c5 \u03c0\u03b5\u03c1\u03b9\u03bf\u03c1\u03af\u03b6\u03b5\u03b9 \u03c4\u03b7\u03bd \u03c4\u03b1\u03c7\u03cd\u03c4\u03b7\u03c4\u03b1 \u03b4\u03b9\u03b1\u03bc\u03b5\u03c4\u03b1\u03b3\u03c9\u03b3\u03ae\u03c2 \u03c3\u03c4\u03b1
+limitNet = \u03c0\u03b5\u03c1\u03b9\u03bf\u03c1\u03b9\u03c3\u03bc\u03ad\u03bd\u03b7 \u03b1\u03c0\u03cc \u03c4\u03bf \u03b4\u03af\u03ba\u03c4\u03c5\u03bf
+limitRx = \u03c0\u03b5\u03c1\u03b9\u03bf\u03c1\u03b9\u03c3\u03bc\u03ad\u03bd\u03b7 \u03b1\u03c0\u03cc \u03c4\u03bf\u03bd \u03c0\u03b1\u03c1\u03b1\u03bb\u03ae\u03c0\u03c4\u03b7 \u03ba\u03b1\u03c4\u03ac \u03c4\u03bf
+limitTx = \u03c0\u03b5\u03c1\u03b9\u03bf\u03c1\u03b9\u03c3\u03bc\u03ad\u03bd\u03b7 \u03b1\u03c0\u03cc \u03c4\u03bf\u03bd \u03b1\u03c0\u03bf\u03c3\u03c4\u03bf\u03bb\u03ad\u03b1 \u03ba\u03b1\u03c4\u03ac \u03c4\u03bf
+linkFullDpx = \u0397 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7 \u03c3\u03b5 \u03b4\u03b9\u03b1\u03bc\u03cc\u03c1\u03c6\u03c9\u03c3\u03b7 full duplex
+linkHalfDpx = \u0397 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7 \u03c3\u03b5 \u03b4\u03b9\u03b1\u03bc\u03cc\u03c1\u03c6\u03c9\u03c3\u03b7 half duplex
+loggingWrongMessage = Logging to server: \u0395\u03bb\u03ae\u03c6\u03b8\u03b7 \u03bb\u03ac\u03b8\u03bf\u03c2 \u03c4\u03cd\u03c0\u03bf\u03c2 \u03c4\u03bf\u03c5 \u03bc\u03b7\u03bd\u03cd\u03bc\u03b1\u03c4\u03bf\u03c2
+lookupError = \u0394\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03b4\u03c5\u03bd\u03b1\u03c4\u03cc \u03bd\u03b1 \u03b2\u03c1\u03b5\u03b8\u03b5\u03af \u03b7 \u0399\u03a1 \u03b4\u03b9\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7 \u03c4\u03bf\u03c5 \u03b1\u03c0\u03ad\u03bd\u03b1\u03bd\u03c4\u03b9 \u03ac\u03ba\u03c1\u03bf\u03c5
+mboxWrongMessage = \u0394\u03bf\u03ba\u03b9\u03bc\u03ae \u03b3\u03b9\u03b1 \u03b5\u03bd\u03b4\u03b9\u03ac\u03bc\u03b5\u03c3\u03bf\u03c5\u03c2 \u03ba\u03cc\u03bc\u03b2\u03bf\u03c5\u03c2: \u0395\u03bb\u03ae\u03c6\u03b8\u03b7 \u03bb\u03ac\u03b8\u03bf\u03c2 \u03c4\u03cd\u03c0\u03bf\u03c2 \u03bc\u03b7\u03bd\u03cd\u03bc\u03b1\u03c4\u03bf\u03c2
+middlebox = \u0395\u03bd\u03b4\u03b9\u03ac\u03bc\u03b5\u03c3\u03bf\u03c2 \u03ba\u03cc\u03bc\u03b2\u03bf\u03c2
+middleboxFail = \u039f \u03b5\u03be\u03c5\u03c0\u03b7\u03c1\u03b5\u03c4\u03b7\u03c4\u03ae\u03c2 \u03b1\u03c0\u03ad\u03c4\u03c5\u03c7\u03b5 \u03ba\u03b1\u03b8\u03ce\u03c2 \u03b3\u03b9\u03bd\u03cc\u03c4\u03b1\u03bd \u03b4\u03bf\u03ba\u03b9\u03bc\u03ae \u03b3\u03b9\u03b1 \u03b5\u03bd\u03b4\u03b9\u03ac\u03bc\u03b5\u03c3\u03bf\u03c5\u03c2 \u03ba\u03cc\u03bc\u03b2\u03bf\u03c5\u03c2
+middleboxFail2 = \u0391\u03c0\u03ad\u03c4\u03c5\u03c7\u03b5 \u03b7 \u03b4\u03bf\u03ba\u03b9\u03bc\u03ae \u03b3\u03b9\u03b1 \u03b5\u03bd\u03b4\u03b9\u03ac\u03bc\u03b5\u03c3\u03bf\u03c5\u03c2 \u03ba\u03cc\u03bc\u03b2\u03bf\u03c5\u03c2!
+middleboxModifyingMss = \u03a0\u03bb\u03b7\u03c1\u03bf\u03c6\u03bf\u03c1\u03af\u03b1: \u039a\u03ac\u03c0\u03bf\u03b9\u03bf\u03c2 \u03b5\u03bd\u03b4\u03b9\u03ac\u03bc\u03b5\u03c3\u03bf\u03c2 \u03ba\u03cc\u03b2\u03bc\u03bf\u03c2 \u03c4\u03c1\u03bf\u03c0\u03bf\u03c0\u03bf\u03b9\u03b5\u03af \u03c4\u03bf MSS
+middleboxTest = Tcpbw100 \u03b4\u03bf\u03ba\u03b9\u03bc\u03ae \u03b3\u03b9\u03b1 \u03b5\u03bd\u03b4\u03b9\u03ac\u03bc\u03b5\u03c3\u03bf\u03c5\u03c2 \u03ba\u03cc\u03bc\u03b2\u03bf\u03c5\u03c2...
+meta = META
+metaFailed = \u0397 \u03bc\u03b5\u03c4\u03b1-\u03b4\u03bf\u03ba\u03b9\u03bc\u03ae \u03b1\u03c0\u03ad\u03c4\u03c5\u03c7\u03b5!
+metaTest = \u03bc\u03b5\u03c4\u03b1-\u03b4\u03bf\u03ba\u03b9\u03bc\u03ae...
+metaWrongMessage = \u03bc\u03b5\u03c4\u03b1-\u03b4\u03bf\u03ba\u03b9\u03bc\u03ae: \u0395\u03bb\u03ae\u03c6\u03b8\u03b7 \u03bb\u03ac\u03b8\u03bf\u03c2 \u03c4\u03cd\u03c0\u03bf\u03c2 \u03bc\u03b7\u03bd\u03cd\u03bc\u03b1\u03c4\u03bf\u03c2
+moreDetails = \u03a0\u03b5\u03c1\u03b9\u03c3\u03c3\u03cc\u03c4\u03b5\u03c1\u03b5\u03c2 \u03bb\u03b5\u03c0\u03c4\u03bf\u03bc\u03ad\u03c1\u03b5\u03b9\u03b5\u03c2...
+name = \u038c\u03bd\u03bf\u03bc\u03b1
+ndtServerHas = \u039f \u03b5\u03be\u03c5\u03c0\u03b7\u03c1\u03b5\u03c4\u03b7\u03c4\u03ae\u03c2 NDT \u03ad\u03c7\u03b5\u03b9 \u03ad\u03bd\u03b1
+noPktLoss1 = \u039a\u03b1\u03bc\u03bc\u03af\u03b1 \u03b1\u03c0\u03ce\u03bb\u03b5\u03b9\u03b1 \u03c0\u03b1\u03ba\u03ad\u03c4\u03c9\u03bd
+noPktLoss2 = \u0394\u03b5\u03bd \u03c0\u03b1\u03c1\u03b1\u03c4\u03b7\u03c1\u03ae\u03b8\u03b7\u03ba\u03b5 \u03ba\u03b1\u03bc\u03bc\u03af\u03b1 \u03b1\u03c0\u03ce\u03bb\u03b5\u03b9\u03b1 \u03c0\u03b1\u03ba\u03ad\u03c4\u03c9\u03bd
+numberOfTests = \u0391\u03c1\u03b9\u03b8\u03bc\u03cc\u03c2 \u03bc\u03b5\u03c4\u03c1\u03ae\u03c3\u03b5\u03c9\u03bd
+of = \u03b1\u03c0\u03cc
+off = OFF
+ok = OK
+oldDuplexMismatch = "\u03a0\u03c1\u03bf\u03c3\u03bf\u03c7\u03ae: \u0391\u03bd\u03b9\u03c7\u03bd\u03b5\u03cd\u03b8\u03b7\u03ba\u03b5 \u03c0\u03b9\u03b8\u03b1\u03bd\u03ae \u03b1\u03bd\u03b1\u03bd\u03c4\u03b9\u03c3\u03c4\u03bf\u03b9\u03c7\u03af\u03b1 \u03c3\u03c4\u03b7\u03bd \u03b4\u03b9\u03b1\u03bc\u03cc\u03c1\u03c6\u03c9\u03c3\u03b7 duplex \u03bc\u03b5 \u03b2\u03ac\u03c3\u03b7 \u03c4\u03b7\u03bd \u03c0\u03b1\u03bb\u03b9\u03ac \u03c3\u03c5\u03bd\u03b8\u03ae\u03ba\u03b7: "
+on = ON
+ooOrder = \u03b1\u03bb\u03bb\u03ac \u03ba\u03ac\u03c0\u03bf\u03b9\u03b1 \u03c0\u03b1\u03ba\u03ad\u03c4\u03b1 \u03ad\u03c6\u03c4\u03b1\u03c3\u03b1\u03bd \u03bc\u03b5 \u03bb\u03ac\u03b8\u03bf\u03c2 \u03c3\u03b5\u03b9\u03c1\u03ac \u03ba\u03b1\u03c4\u03ac \u03c4\u03bf
+options = \u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ad\u03c2
+osData = \u03c0\u03bb\u03b7\u03c1\u03bf\u03c6\u03bf\u03c1\u03af\u03b5\u03c2 \u03bb\u03b5\u03b9\u03c4\u03bf\u03c5\u03c1\u03b3\u03b9\u03ba\u03bf\u03cd \u03c3\u03c5\u03c3\u03c4\u03ae\u03bc\u03b1\u03c4\u03bf\u03c2:
+otherClient = \u0395\u03c0\u03af \u03c4\u03bf\u03c5 \u03c0\u03b1\u03c1\u03cc\u03bd\u03c4\u03bf\u03c2 \u03ad\u03bd\u03b1\u03c2 \u03ac\u03bb\u03bb\u03bf\u03c2 \u03c0\u03b5\u03bb\u03ac\u03c4\u03b7\u03c2 \u03b5\u03be\u03c5\u03c0\u03b7\u03c1\u03b5\u03c4\u03b5\u03af\u03c4\u03b1\u03b9, \u03b7 \u03bc\u03ad\u03c4\u03c1\u03b7\u03c3\u03ae \u03c3\u03b1\u03c2 \u03b8\u03b1 \u03be\u03b5\u03ba\u03b9\u03bd\u03ae\u03c3\u03b5\u03b9 \u03b5\u03bd\u03c4\u03cc\u03c2
+otherTraffic = \u039a\u03af\u03bd\u03b7\u03c3\u03b7 \u03ac\u03bb\u03bb\u03b7\u03c2 \u03c0\u03c1\u03bf\u03ad\u03bb\u03b5\u03c5\u03c3\u03b7\u03c2 \u03c0\u03c1\u03bf\u03ba\u03b1\u03bb\u03b5\u03af \u03c3\u03c5\u03bc\u03c6\u03cc\u03c1\u03b7\u03c3\u03b7 \u03c3\u03c4\u03b7\u03bd \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7
+outboundTest = Tcpbw100 \u03b4\u03bf\u03ba\u03b9\u03bc\u03ae \u03c0\u03c1\u03bf\u03c2 \u03c4\u03b1 \u03ad\u03be\u03c9...
+outboundWrongMessage = \u0394\u03bf\u03ba\u03b9\u03bc\u03ae: \u03c4\u03b1\u03c7\u03cd\u03c4\u03b7\u03c4\u03b1 \u03b4\u03b9\u03b1\u03bc\u03b5\u03c4\u03b1\u03b3\u03c9\u03b3\u03ae\u03c2 \u03b1\u03c0\u03cc \u03c0\u03b5\u03bb\u03ac\u03c4\u03b7 \u03c0\u03c1\u03bf\u03c2 \u03b5\u03be\u03c5\u03c0\u03b7\u03c1\u03b5\u03c4\u03b7\u03c4\u03ae: \u039b\u03ac\u03b2\u03b1\u03bc\u03b5 \u03bb\u03ac\u03b8\u03bf\u03c2 \u03c4\u03cd\u03c0\u03bf \u03bc\u03b7\u03bd\u03cd\u03bc\u03b1\u03c4\u03bf\u03c2
+packetQueuing = \u03a4\u03b1 \u03c0\u03b1\u03ba\u03ad\u03c4\u03b1 \u03bc\u03c0\u03b1\u03af\u03bd\u03bf\u03c5\u03bd \u03c3\u03b5 \u03bf\u03c5\u03c1\u03ac
+packetQueuingInfo = \u03a4\u03bf TCP (Transmission Control Protocol) \u03bc\u03b5\u03c4\u03b1\u03c6\u03ad\u03c1\u03b5\u03b9 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03b1 \u03bc\u03b5 \u03b1\u03be\u03b9\u03cc\u03c0\u03b9\u03c3\u03c4\u03bf \u03c4\u03c1\u03cc\u03c0\u03bf \u03b1\u03bd\u03ac\u03bc\u03b5\u03c3\u03b1 \u03c3\u03b5 \u03b4\u03cd\u03bf \u03c5\u03c0\u03bf\u03bb\u03bf\u03b3\u03b9\u03c3\u03c4\u03ad\u03c2. \u03a4\u03bf TCP \u03ba\u03b1\u03c4\u03b1\u03bb\u03b1\u03b2\u03b1\u03af\u03bd\u03b5\u03b9 \u03ba\u03b1\u03b9 \u03b4\u03b9\u03bf\u03c1\u03b8\u03ce\u03bd\u03b5\u03b9 \u03b1\u03c5\u03c4\u03cc\u03bc\u03b1\u03c4\u03b1 \u03bb\u03ac\u03b8\u03b7 \u03ba\u03b1\u03b9 \u03b1\u03c0\u03ce\u03bb\u03b5\u03b9\u03b5\u03c2. \u03a4\u03bf TCP \u03c7\u03c1\u03b7\u03c3\u03b9\u03bc\u03bf\u03c0\u03bf\u03b9\u03b5\u03af buffers \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03c0\u03b5\u03c4\u03cd\u03c7\u03b5\u03b9 \u03b1\u03c5\u03c4\u03ae \u03c4\u03b7\u03bd \u03b1\u03be\u03b9\u03bf\u03c0\u03b9\u03c3\u03c4\u03af\u03b1. \u0395\u03c0\u03b9\u03c0\u03c1\u03cc\u03c3\u03b8\u03b5\u03c4\u03b1, \u03bf\u03b9 \u03b4\u03c1\u03bf\u03bc\u03bf\u03bb\u03bf\u03b3\u03b7\u03c4\u03ad\u03c2 \u03ba\u03b1\u03b9 \u03bf\u03b9 \u03bc\u03b5\u03c4\u03b1\u03b3\u03c9\u03b3\u03b5\u03af\u03c2 \u03c7\u03c1\u03b7\u03c3\u03b9\u03bc\u03bf\u03c0\u03bf\u03b9\u03bf\u03cd\u03bd buffers \u03b3\u03b9\u03b1 \u03c0\u03b5\u03c1\u03b9\u03c0\u03c4\u03ce\u03c3\u03b5\u03b9\u03c2 \u03cc\u03c0\u03bf\u03c5 \u03c0\u03bf\u03bb\u03bb\u03b1\u03c0\u03bb\u03ad\u03c2 \u03c3\u03c5\u03bd\u03b4\u03ad\u03c3\u03b5\u03b9\u03c2 \u03b5\u03b9\u03c3\u03cc\u03b4\u03bf\u03c5 \u03c3\u03c4\u03ad\u03bb\u03bd\u03bf\u03c5\u03bd \u03c0\u03b1\u03ba\u03ad\u03c4\u03b1 \u03c3\u03b5 \u03bc\u03b9\u03b1 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7 \u03b5\u03be\u03cc\u03b4\u03bf\u03c5 \u03ae \u03cc\u03c0\u03bf\u03c5 \u03b7 \u03c4\u03b1\u03c7\u03cd\u03c4\u03b7\u03c4\u03b1 \u03c4\u03c9\u03bd \u03c3\u03c5\u03bd\u03b4\u03ad\u03c3\u03b5\u03c9\u03bd \u03b1\u03bb\u03bb\u03ac\u03b6\u03b5\u03b9 (\u03c0.\u03c7. FastEthernet \u03c3\u03b5 DSL modem).\n\n \u039f \u03b5\u03be\u03c5\u03c0\u03b7\u03c1\u03b5\u03c4\u03b7\u03c4\u03ae\u03c2 NDT \u03c0\u03b1\u03c1\u03ac\u03b3\u03b5\u03b9 \u03ba\u03b1\u03b9 \u03c3\u03c4\u03ad\u03bb\u03bd\u03b5\u03b9 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03b1 \u03c3\u03c4\u03bf \u03c0\u03b5\u03bb\u03ac\u03c4\u03b7 \u03b3\u03b9\u03b1 10 \u03b4\u03b5\u03c5\u03c4\u03b5\u03c1\u03cc\u03bb\u03b5\u03c0\u03c4\u03b1. \u03a3\u03b5 \u03ba\u03ac\u03c0\u03bf\u03b9\u03b5\u03c2 \u03c0\u03b5\u03c1\u03b9\u03c0\u03c4\u03ce\u03c3\u03b5\u03b9\u03c2 \u03bf \u03b5\u03be\u03c5\u03c0\u03b7\u03c1\u03b5\u03c4\u03b7\u03c4\u03ae\u03c2 \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03c0\u03b1\u03c1\u03ac\u03b3\u03b5\u03b9 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03b1 \u03c0\u03b9\u03bf \u03b3\u03c1\u03ae\u03b3\u03bf\u03c1\u03b1 \u03b1\u03c0\u03cc \u03c4\u03bf\u03bd \u03c1\u03c5\u03b8\u03bc\u03cc \u03bc\u03b5 \u03c4\u03bf\u03bd \u03bf\u03c0\u03bf\u03af\u03bf \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03c3\u03c4\u03b5\u03af\u03bb\u03b5\u03b9 \u03c4\u03b1 \u03c0\u03b1\u03ba\u03ad\u03c4\u03b1 \u03c3\u03c4\u03bf \u03b4\u03af\u03ba\u03c4\u03c5\u03bf (\u03c0.\u03c7., \u03ad\u03bd\u03b1\u03c2 \u03b5\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03c4\u03ae\u03c2 \u03c4\u03c9\u03bd 2 GHz \u03bd\u03b1 \u03c3\u03c4\u03ad\u03bb\u03bd\u03b5\u03b9 \u03c3\u03b5 \u03ad\u03bd\u03b1\u03bd \u03c0\u03b5\u03bb\u03ac\u03c4\u03b7 DSL).\n \u038c\u03c4\u03b1\u03bd \u03c3\u03c5\u03bc\u03b2\u03b1\u03af\u03bd\u03b5\u03b9 \u03b1\u03c5\u03c4\u03cc, \u03ba\u03ac\u03c0\u03bf\u03b9\u03b1 \u03c0\u03b1\u03ba\u03ad\u03c4\u03b1 \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03bc\u03b5\u03af\u03bd\u03bf\u03c5\u03bd \u03c3\u03c4\u03b7\u03bd \u03bf\u03c5\u03c1\u03ac \u03b5\u03be\u03cc\u03b4\u03bf\u03c5 \u03c4\u03bf\u03c5 \u03b5\u03be\u03c5\u03c0\u03b7\u03c1\u03b5\u03c4\u03b7\u03c4\u03ae \u03cc\u03c4\u03b1\u03bd \u03c4\u03b1 10 \u03b4\u03b5\u03c5\u03c4\u03b5\u03c1\u03cc\u03bb\u03b5\u03c0\u03c4\u03b1 \u03c4\u03b5\u03bb\u03b5\u03b9\u03ce\u03c3\u03bf\u03c5\u03bd. \u03a4\u03bf TCP \u03b8\u03b1 \u03c3\u03c5\u03bd\u03b5\u03c7\u03af\u03c3\u03b5\u03b9 \u03b1\u03c5\u03c4\u03cc\u03bc\u03b1\u03c4\u03b1 \u03bd\u03b1 \u03c3\u03c4\u03ad\u03bb\u03bd\u03b5\u03b9 \u03b1\u03c5\u03c4\u03ac \u03c4\u03b1 \u03c0\u03b1\u03ba\u03ad\u03c4\u03b1 \u03c4\u03b7\u03c2 \u03bf\u03c5\u03c1\u03ac\u03c2 \u03ba\u03b1\u03b9 \u03bf \u03c0\u03b5\u03bb\u03ac\u03c4\u03b7\u03c2 \u03b8\u03b1 \u03c3\u03c5\u03bd\u03b5\u03c7\u03af\u03c3\u03b5\u03b9 \u03bd\u03b1 \u03c4\u03b1 \u03bb\u03b1\u03bc\u03b2\u03ac\u03bd\u03b5\u03b9 \u03ba\u03b1\u03b9 \u03bd\u03b1 \u03c4\u03b1 \u03b5\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03ac\u03b6\u03b5\u03c4\u03b1\u03b9, \u03bc\u03b5 \u03b1\u03c0\u03bf\u03c4\u03ad\u03bb\u03b5\u03c3\u03bc\u03b1 \u03b7 \u03bc\u03ad\u03c4\u03c1\u03b7\u03c3\u03b7 \u03bd\u03b1 \u03ba\u03ac\u03bd\u03b5\u03b9 \u03c0\u03b5\u03c1\u03b9\u03c3\u03c3\u03cc\u03c4\u03b5\u03c1\u03bf \u03b1\u03c0\u03cc \u03cc\u03c3\u03bf \u03b1\u03bd\u03b5\u03bc\u03ad\u03bd\u03b5\u03c4\u03bf.\n\n \u039a\u03ac\u03c4\u03b9 \u03c4\u03ad\u03c4\u03bf\u03b9\u03bf \u03c3\u03c5\u03bd\u03ad\u03b2\u03b7 \u03ba\u03b1\u03c4\u03ac \u03c4\u03b7\u03bd \u03b4\u03b9\u03ac\u03c1\u03ba\u03b5\u03b9\u03b1 \u03b1\u03c5\u03c4\u03ae\u03c2 \u03c4\u03b7\u03c2 \u03b4\u03bf\u03ba\u03b9\u03bc\u03ae\u03c2. \u0394\u03b5\u03bd \u03c7\u03c1\u03b5\u03b9\u03ac\u03b6\u03b5\u03c4\u03b1\u03b9 \u03ba\u03ac\u03c0\u03bf\u03b9\u03b1 \u03b4\u03b9\u03cc\u03c1\u03b8\u03c9\u03c3\u03b7 \u03b3\u03b9\u03b1 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf \u03c6\u03b1\u03b9\u03bd\u03cc\u03bc\u03b5\u03bd\u03bf.
+packetSizePreserved = \u03a4\u03bf \u03bc\u03ad\u03b3\u03b5\u03b8\u03bf\u03c2 \u03c4\u03bf\u03c5 \u03c0\u03b1\u03ba\u03ad\u03c4\u03bf\u03c5 \u03b4\u03b9\u03b1\u03c4\u03b7\u03c1\u03b5\u03af\u03c4\u03b1\u03b9 \u03b1\u03c0\u03cc \u03ac\u03ba\u03c1\u03b7 \u03c3\u03b5 \u03ac\u03ba\u03c1\u03b7
+packetsize = \u03bc\u03ad\u03b3\u03b5\u03b8\u03bf\u03c2 \u03c0\u03b1\u03ba\u03ad\u03c4\u03bf\u03c5
+pc = PC
+pctOfTime = % \u03c4\u03bf\u03c5 \u03c7\u03c1\u03cc\u03bd\u03bf\u03c5
+performedTests = \u0394\u03bf\u03ba\u03b9\u03bc\u03ad\u03c2 \u03c0\u03bf\u03c5 \u03ad\u03b3\u03b9\u03bd\u03b1\u03bd
+pktsRetrans = \u03c0\u03b1\u03ba\u03ad\u03c4\u03b1 \u03c0\u03bf\u03c5 \u03be\u03b1\u03bd\u03b1\u03bc\u03b5\u03c4\u03b1\u03b4\u03cc\u03b8\u03b7\u03ba\u03b1\u03bd
+possibleDuplexFullHalf = \u03a0\u03c1\u03bf\u03c3\u03bf\u03c7\u03ae: \u0391\u03bd\u03b9\u03c7\u03bd\u03b5\u03cd\u03b8\u03b7\u03ba\u03b5 \u03c0\u03b9\u03b8\u03b1\u03bd\u03ae \u03b1\u03bd\u03b1\u03bd\u03c4\u03b9\u03c3\u03c4\u03bf\u03b9\u03c7\u03af\u03b1 \u03c3\u03c4\u03b7\u03bd \u03b4\u03b9\u03b1\u03bc\u03cc\u03c1\u03c6\u03c9\u03c3\u03b7 duplex Switch=Full and \u03a5\u03c0\u03bf\u03bb\u03bf\u03b3\u03b9\u03c3\u03c4\u03ae\u03c2=half
+possibleDuplexHalfFull = \u03a0\u03c1\u03bf\u03c3\u03bf\u03c7\u03ae: \u0391\u03bd\u03b9\u03c7\u03bd\u03b5\u03cd\u03b8\u03b7\u03ba\u03b5 \u03c0\u03b9\u03b8\u03b1\u03bd\u03ae \u03b1\u03bd\u03b1\u03bd\u03c4\u03b9\u03c3\u03c4\u03bf\u03b9\u03c7\u03af\u03b1 \u03c3\u03c4\u03b7\u03bd \u03b4\u03b9\u03b1\u03bc\u03cc\u03c1\u03c6\u03c9\u03c3\u03b7 duplex Switch=half and \u03a5\u03c0\u03bf\u03bb\u03bf\u03b3\u03b9\u03c3\u03c4\u03ae\u03c2=full
+possibleDuplexHalfFullWarning = \u03a0\u03c1\u03bf\u03c3\u03bf\u03c7\u03ae: \u0391\u03bd\u03b9\u03c7\u03bd\u03b5\u03cd\u03b8\u03b7\u03ba\u03b5 \u03c0\u03b9\u03b8\u03b1\u03bd\u03ae \u03b1\u03bd\u03b1\u03bd\u03c4\u03b9\u03c3\u03c4\u03bf\u03b9\u03c7\u03af\u03b1 \u03c3\u03c4\u03b7\u03bd \u03b4\u03b9\u03b1\u03bc\u03cc\u03c1\u03c6\u03c9\u03c3\u03b7 duplex Switch=half and \u03a5\u03c0\u03bf\u03bb\u03bf\u03b3\u03b9\u03c3\u03c4\u03ae\u03c2=full
+preferIPv6 = \u03c0\u03c1\u03bf\u03c4\u03af\u03bc\u03b7\u03c3\u03b7 IPv6
+printDetailedStats = \u0395\u03ba\u03c4\u03cd\u03c0\u03c9\u03c3\u03b7 \u03b1\u03bd\u03b1\u03bb\u03c5\u03c4\u03b9\u03ba\u03ce\u03bd \u03c3\u03c4\u03b1\u03c4\u03b9\u03c3\u03c4\u03b9\u03ba\u03ce\u03bd
+protocolError = \u039b\u03ac\u03b8\u03bf\u03c2 \u03c3\u03c4\u03bf \u03c0\u03c1\u03c9\u03c4\u03cc\u03ba\u03bf\u03bb\u03bb\u03bf! \u03a0\u03b5\u03c1\u03b9\u03bc\u03ad\u03bd\u03b1\u03bc\u03b5 'prepare', \u03c0\u03ae\u03c1\u03b1\u03bc\u03b5: 0x
+qSeen = \u03b4\u03bf\u03ba\u03b9\u03bc\u03ae \u03c4\u03b1\u03c7\u03cd\u03c4\u03b7\u03c4\u03b1\u03c2 \u03b4\u03b9\u03b1\u03bc\u03b5\u03c4\u03b1\u03b3\u03c9\u03b3\u03ae\u03c2: \u0391\u03bd\u03b9\u03c7\u03bd\u03b5\u03cd\u03b8\u03b7\u03ba\u03b5 \u03cc\u03c4\u03b9 \u03c4\u03b1 \u03c0\u03b1\u03ba\u03ad\u03c4\u03b1 \u03bc\u03c0\u03b1\u03af\u03bd\u03bf\u03c5\u03bd \u03c3\u03b5 \u03bf\u03c5\u03c1\u03ac
+ready = \u03a4\u03bf Tcpbw100 \u03b5\u03af\u03bd\u03b1\u03b9 \u03ad\u03c4\u03bf\u03b9\u03bc\u03bf
+receiveBufferShouldBe = \u03a0\u03bb\u03b7\u03c1\u03bf\u03c6\u03bf\u03c1\u03af\u03b1: \u03a4\u03bf buffer \u03bb\u03ae\u03c8\u03b7\u03c2 \u03c0\u03c1\u03ad\u03c0\u03b5\u03b9 \u03bd\u03b1 \u03b5\u03af\u03bd\u03b1\u03b9
+receiving = \u039b\u03ae\u03c8\u03b7 \u03b1\u03c0\u03bf\u03c4\u03b5\u03bb\u03b5\u03c3\u03bc\u03ac\u03c4\u03c9\u03bd...
+reportProblem = \u0391\u03bd\u03b1\u03c6\u03bf\u03c1\u03ac \u03c0\u03c1\u03bf\u03b2\u03bb\u03ae\u03bc\u03b1\u03c4\u03bf\u03c2
+resultsParseError = \u0394\u03b5\u03bd \u03bc\u03c0\u03bf\u03c1\u03bf\u03cd\u03bc\u03b5 \u03bd\u03b1 \u03b5\u03c1\u03bc\u03b7\u03bd\u03b5\u03cd\u03c3\u03bf\u03c5\u03bc\u03b5 \u03c4\u03b1 \u03b1\u03c0\u03bf\u03c4\u03b5\u03bb\u03ad\u03c3\u03bc\u03b1\u03c4\u03b1 \u03c4\u03c9\u03bd \u03b4\u03bf\u03ba\u03b9\u03bc\u03ce\u03bd!
+resultsTimeout = \u03a0\u03c1\u03bf\u03c3\u03bf\u03c7\u03ae! \u03a4\u03b5\u03bb\u03b5\u03af\u03c9\u03c3\u03b5 \u03bf \u03c7\u03c1\u03cc\u03bd\u03bf\u03c2 \u03c4\u03bf\u03c5 \u03c0\u03b5\u03bb\u03ac\u03c4\u03b7 \u03ba\u03b1\u03b8\u03ce\u03c2 \u03b3\u03b9\u03bd\u03cc\u03c4\u03b1\u03bd \u03b1\u03bd\u03ac\u03b3\u03bd\u03c9\u03c3\u03b7 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd, \u03c0\u03b9\u03b8\u03b1\u03bd\u03ae \u03b1\u03bd\u03b1\u03bd\u03c4\u03b9\u03c3\u03c4\u03bf\u03b9\u03c7\u03af\u03b1 \u03c3\u03c4\u03b7\u03bd \u03b4\u03b9\u03b1\u03bc\u03cc\u03c1\u03c6\u03c9\u03c3\u03b7 duplex
+resultsWrongMessage = \u0391\u03c0\u03bf\u03c4\u03b5\u03bb\u03ad\u03c3\u03bc\u03b1\u03c4\u03b1 \u03b4\u03bf\u03ba\u03b9\u03bc\u03ce\u03bd: \u039b\u03ac\u03b2\u03b1\u03bc\u03b5 \u03bb\u03ac\u03b8\u03bf\u03c2 \u03c4\u03cd\u03c0\u03bf \u03bc\u03b7\u03bd\u03cd\u03bc\u03b1\u03c4\u03bf\u03c2!
+rtt = \u03a7\u03c1\u03cc\u03bd\u03bf\u03c2 \u03b1\u03c0\u03cc\u03ba\u03c1\u03b9\u03c3\u03b7\u03c2 (RTT)
+rttFail = \u039f \u03b1\u03bb\u03b3\u03cc\u03c1\u03b9\u03b8\u03bc\u03bf\u03c2 \u03b1\u03bd\u03af\u03c7\u03bd\u03b5\u03c5\u03c3\u03b7\u03c2 \u03c4\u03cd\u03c0\u03bf\u03c5 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7\u03c2 \u03b1\u03c0\u03ad\u03c4\u03c5\u03c7\u03b5 \u03bb\u03cc\u03b3\u03c9 \u03c5\u03c0\u03b5\u03c1\u03b2\u03bf\u03bb\u03b9\u03ba\u03ac \u03bc\u03b5\u03b3\u03ac\u03bb\u03c9\u03bd \u03c7\u03c1\u03cc\u03bd\u03c9\u03bd \u03b1\u03c0\u03cc\u03ba\u03c1\u03b9\u03c3\u03b7\u03c2 (RTT).
+runningInboundTest = \u0394\u03bf\u03ba\u03b9\u03bc\u03ae \u03c0\u03c1\u03bf\u03c2 \u03c4\u03b1 \u03bc\u03ad\u03c3\u03b1 \u03b3\u03b9\u03b1 10 \u03b4\u03b5\u03c5\u03c4\u03b5\u03c1\u03cc\u03bb\u03b5\u03c0\u03c4\u03b1 (\u03b5\u03be\u03c5\u03c0\u03b7\u03c1\u03b5\u03c4\u03b7\u03c4\u03ae\u03c2 \u03c0\u03c1\u03bf\u03c2 \u03c0\u03b5\u03bb\u03ac\u03c4\u03b7) . . . . . .
+runningOutboundTest = \u0394\u03bf\u03ba\u03b9\u03bc\u03ae \u03c0\u03c1\u03bf\u03c2 \u03c4\u03b1 \u03ad\u03be\u03c9 \u03b3\u03b9\u03b1 10 \u03b4\u03b5\u03c5\u03c4\u03b5\u03c1\u03cc\u03bb\u03b5\u03c0\u03c4\u03b1 (\u03c0\u03b5\u03bb\u03ac\u03c4\u03b7\u03c2 \u03c0\u03c1\u03bf\u03c2 \u03b5\u03be\u03c5\u03c0\u03b7\u03c1\u03b5\u03c4\u03b7\u03c4\u03ae) . . . . .
+s2c = \u0395\u03be\u03c5\u03c0\u03b7\u03c1\u03b5\u03c4\u03b7\u03c4\u03ae\u03c2 \u03c0\u03c1\u03bf\u03c2 \u03c0\u03b5\u03bb\u03ac\u03c4\u03b7:
+s2cPacketQueuingDetected = [\u0395\u03be\u03c5\u03c0\u03b7\u03c1\u03b5\u03c4\u03ae\u03c2 \u03c0\u03c1\u03bf\u03c2 \u03c0\u03b5\u03bb\u03ac\u03c4\u03b7]: \u0391\u03bd\u03b9\u03c7\u03bd\u03b5\u03cd\u03b8\u03b7\u03ba\u03b5 \u03cc\u03c4\u03b9 \u03c4\u03b1 \u03c0\u03b1\u03ba\u03ad\u03c4\u03b1 \u03bc\u03c0\u03b1\u03af\u03bd\u03bf\u03c5\u03bd \u03c3\u03b5 \u03bf\u03c5\u03c1\u03ac
+s2cThroughput = \u03c4\u03b1\u03c7\u03cd\u03c4\u03b7\u03c4\u03b1 \u03b4\u03b9\u03b1\u03bc\u03b5\u03c4\u03b1\u03b3\u03c9\u03b3\u03ae\u03c2 \u03b1\u03c0\u03cc \u03b5\u03be\u03c5\u03c0\u03b7\u03c1\u03b5\u03c4\u03b7\u03c4\u03ae \u03c0\u03c1\u03bf\u03c2 \u03c0\u03b5\u03bb\u03ac\u03c4\u03b7
+s2cThroughputFailed = \u0391\u03c0\u03ad\u03c4\u03c5\u03c7\u03b5 \u03b7 \u03bc\u03ad\u03c4\u03c1\u03b7\u03c3\u03b7 \u03c4\u03b7\u03c2 \u03c4\u03b1\u03c7\u03cd\u03c4\u03b7\u03c4\u03b1\u03c2 \u03b4\u03b9\u03b1\u03bc\u03b5\u03c4\u03b1\u03b3\u03c9\u03b3\u03ae\u03c2 \u03b1\u03c0\u03cc \u03c4\u03bf\u03bd \u03b5\u03be\u03c5\u03c0\u03b7\u03c1\u03b5\u03c4\u03b7\u03c4\u03ae \u03c0\u03c1\u03bf\u03c2 \u03c4\u03bf\u03bd \u03c0\u03b5\u03bb\u03ac\u03c4\u03b7!
+sackReceived = SACK blocks \u03b5\u03bb\u03ae\u03c6\u03b8\u03b7\u03c3\u03b1\u03bd
+scalingFactors = \u03a0\u03b1\u03c1\u03ac\u03b3\u03bf\u03bd\u03c4\u03b5\u03c2 \u039a\u03bb\u03b9\u03bc\u03ac\u03ba\u03c9\u03c3\u03b7\u03c2
+seconds = \u03b4\u03b5\u03c5\u03c4\u03b5\u03c1\u03cc\u03bb\u03b5\u03c0\u03c4\u03b1
+sendingMetaInformation = \u0391\u03c0\u03bf\u03c3\u03c4\u03bf\u03bb\u03ae \u03bc\u03b5\u03c4\u03b1\u03c0\u03bb\u03b7\u03c1\u03bf\u03c6\u03bf\u03c1\u03af\u03b1\u03c2 . . . . . . . . . . . . . . . . . . .
+server = O \u0395\u03be\u03c5\u03c0\u03b7\u03c1\u03b5\u03c4\u03b7\u03c4\u03ae\u03c2
+serverAcksReport = \u03a4\u03b1 Acks \u03c4\u03bf\u03c5 \u03b5\u03be\u03c5\u03c0\u03b7\u03c1\u03b5\u03c4\u03b7\u03c4\u03ae \u03b4\u03b5\u03af\u03c7\u03bd\u03bf\u03c5\u03bd \u03cc\u03c4\u03b9 \u03b7 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7 \u03b5\u03af\u03bd\u03b1\u03b9
+serverFault = \u039b\u03ac\u03b8\u03bf\u03c2 \u03b5\u03be\u03c5\u03c0\u03b7\u03c1\u03b5\u03c4\u03b7\u03c4\u03ae: \u03b1\u03bd\u03b9\u03c7\u03bd\u03b5\u03cd\u03b8\u03b7\u03ba\u03b5 \u03ba\u03ac\u03c0\u03bf\u03b9\u03b1 \u03b1\u03b3\u03bd\u03ce\u03c3\u03c4\u03bf\u03c5 \u03c4\u03cd\u03c0\u03bf\u03c5 \u03b4\u03c5\u03c3\u03bb\u03b5\u03b9\u03c4\u03bf\u03c5\u03c1\u03b3\u03af\u03b1. \u03a0\u03b1\u03c1\u03b1\u03ba\u03b1\u03bb\u03ce \u03b4\u03bf\u03ba\u03b9\u03bc\u03ac\u03c3\u03c4\u03b5 \u03b1\u03c1\u03b3\u03cc\u03c4\u03b5\u03c1\u03b1
+serverBusy = \u0391\u03c0\u03b1\u03c3\u03c7\u03bf\u03bb\u03b7\u03bc\u03ad\u03bd\u03bf\u03c2 \u03b5\u03be\u03c5\u03c0\u03b7\u03c1\u03b5\u03c4\u03b7\u03c4\u03ae\u03c2: \u03a0\u03ac\u03c1\u03b1 \u03c0\u03bf\u03bb\u03bb\u03bf\u03af \u03c0\u03b5\u03bb\u03ac\u03c4\u03b5\u03c2 \u03c3\u03c4\u03b7\u03bd \u03bf\u03c5\u03c1\u03ac \u03c4\u03bf\u03c5 \u03b5\u03be\u03c5\u03c0\u03b7\u03c1\u03b5\u03c4\u03b7\u03c4\u03ae...\u03c0\u03b1\u03c1\u03b1\u03ba\u03b1\u03bb\u03ce \u03b4\u03bf\u03ba\u03b9\u03bc\u03ac\u03c3\u03c4\u03b5 \u03b1\u03c1\u03b3\u03cc\u03c4\u03b5\u03c1\u03b1
+serverBusy15s = \u0391\u03c0\u03b1\u03c3\u03c7\u03bf\u03bb\u03b7\u03bc\u03ad\u03bd\u03bf\u03c2 \u03b5\u03be\u03c5\u03c0\u03b7\u03c1\u03b5\u03c4\u03b7\u03c4\u03ae\u03c2: \u03a0\u03b1\u03c1\u03b1\u03ba\u03b1\u03bb\u03ce \u03c0\u03b5\u03c1\u03b9\u03bc\u03ad\u03bd\u03b5\u03c4\u03b5 15 \u03b4\u03b5\u03c5\u03c4\u03b5\u03c1\u03cc\u03bb\u03b5\u03c0\u03c4\u03b1 \u03bc\u03ad\u03c7\u03c1\u03b9 \u03b7 \u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03b7 \u03b4\u03bf\u03ba\u03b9\u03bc\u03ae \u03bd\u03b1 \u03c4\u03b5\u03bb\u03b5\u03b9\u03ce\u03c3\u03b5\u03b9
+serverBusy30s = \u0391\u03c0\u03b1\u03c3\u03c7\u03bf\u03bb\u03b7\u03bc\u03ad\u03bd\u03bf\u03c2 \u03b5\u03be\u03c5\u03c0\u03b7\u03c1\u03b5\u03c4\u03b7\u03c4\u03ae\u03c2: \u03a0\u03b1\u03c1\u03b1\u03ba\u03b1\u03bb\u03ce \u03c0\u03b5\u03c1\u03b9\u03bc\u03ad\u03bd\u03b5\u03c4\u03b5 30 \u03b4\u03b5\u03c5\u03c4\u03b5\u03c1\u03cc\u03bb\u03b5\u03c0\u03c4\u03b1 \u03bc\u03ad\u03c7\u03c1\u03b9 \u03b7 \u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03b7 \u03b4\u03bf\u03ba\u03b9\u03bc\u03ae \u03bd\u03b1 \u03c4\u03b5\u03bb\u03b5\u03b9\u03ce\u03c3\u03b5\u03b9
+serverBusy60s = \u0391\u03c0\u03b1\u03c3\u03c7\u03bf\u03bb\u03b7\u03bc\u03ad\u03bd\u03bf\u03c2 \u03b5\u03be\u03c5\u03c0\u03b7\u03c1\u03b5\u03c4\u03b7\u03c4\u03ae\u03c2: \u03a0\u03b1\u03c1\u03b1\u03ba\u03b1\u03bb\u03ce \u03c0\u03b5\u03c1\u03b9\u03bc\u03ad\u03bd\u03b5\u03c4\u03b5 60 \u03b4\u03b5\u03c5\u03c4\u03b5\u03c1\u03cc\u03bb\u03b5\u03c0\u03c4\u03b1 \u03bc\u03ad\u03c7\u03c1\u03b9 \u03b7 \u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03b7 \u03b4\u03bf\u03ba\u03b9\u03bc\u03ae \u03bd\u03b1 \u03c4\u03b5\u03bb\u03b5\u03b9\u03ce\u03c3\u03b5\u03b9
+serverDataReports = \u03a4\u03b1 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03b1 \u03c4\u03bf\u03c5 \u03b5\u03be\u03c5\u03c0\u03b7\u03c1\u03b5\u03c4\u03b7\u03c4\u03ae \u03b4\u03b5\u03af\u03c7\u03bd\u03bf\u03c5\u03bd \u03cc\u03c4\u03b9 \u03b7 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7 \u03b5\u03af\u03bd\u03b1\u03b9
+serverFail = \u039f \u03b5\u03be\u03c5\u03c0\u03b7\u03c1\u03b5\u03c4\u03b7\u03c4\u03ae\u03c2 \u03b1\u03c0\u03ad\u03c4\u03c5\u03c7\u03b5 \u03ba\u03b1\u03c4\u03ac \u03c4\u03b7\u03bd \u03bb\u03ae\u03c8\u03b7 \u03c4\u03c9\u03bd \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd
+serverIpModified = \u03a0\u03bb\u03b7\u03c1\u03bf\u03c6\u03bf\u03c1\u03af\u03b1: \u039a\u03ac\u03c0\u03bf\u03b9\u03b1 \u03c3\u03c5\u03c3\u03ba\u03b5\u03c5\u03ae \u03bc\u03b5 Network Address Translation (NAT) \u03c4\u03c1\u03bf\u03c0\u03bf\u03c0\u03bf\u03b9\u03b5\u03af \u03c4\u03b7\u03bd \u03b4\u03b9\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7 IP \u03c4\u03bf\u03c5 \u03c0\u03b5\u03bb\u03ac\u03c4\u03b7
+serverIpPreserved = \u039f\u03b9 \u03b4\u03b9\u03b5\u03c5\u03b8\u03cd\u03bd\u03c3\u03b5\u03b9\u03c2 \u03c4\u03bf\u03c5 \u03b5\u03be\u03c5\u03c0\u03b7\u03c1\u03b5\u03c4\u03b7\u03c4\u03ae \u03b4\u03b9\u03b1\u03c4\u03b7\u03c1\u03bf\u03cd\u03bd\u03c4\u03b1\u03b9 \u03b1\u03c0\u03cc \u03ac\u03ba\u03c1\u03bf \u03c3\u03b5 \u03ac\u03ba\u03c1\u03bf
+serverNotRunning = \u039f \u03b5\u03be\u03c5\u03c0\u03b7\u03c1\u03b5\u03c4\u03b7\u03c4\u03ae\u03c2 \u03b4\u03b5\u03bd \u03c4\u03c1\u03ad\u03c7\u03b5\u03b9: \u03a0\u03c1\u03ad\u03c0\u03b5\u03b9 \u03bd\u03b1 \u03be\u03b5\u03ba\u03b9\u03bd\u03ae\u03c3\u03b5\u03b9 \u03b7 \u03b4\u03b9\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1 web100srv \u03c3\u03c4\u03bf\u03bd \u03b1\u03c0\u03bf\u03bc\u03b1\u03ba\u03c1\u03c5\u03c3\u03bc\u03ad\u03bd\u03bf \u03b5\u03be\u03c5\u03c0\u03b7\u03c1\u03b5\u03c4\u03b7\u03c4\u03ae
+serverSays = \u039f \u03b5\u03be\u03c5\u03c0\u03b7\u03c1\u03b5\u03c4\u03b7\u03c4\u03ae\u03c2 \u03bb\u03ad\u03b5\u03b9
+sfwFail = \u0391\u03c0\u03ad\u03c4\u03c5\u03c7\u03b5 \u03b7 \u03b1\u03c0\u03bb\u03ae \u03b4\u03bf\u03ba\u03b9\u03bc\u03ae \u03b3\u03b9\u03b1 firewall!
+sfwSocketFail = \u03b1\u03c0\u03bb\u03ae \u03b4\u03bf\u03ba\u03b9\u03bc\u03ae \u03b3\u03b9\u03b1 firewall: \u0394\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03b4\u03c5\u03bd\u03b1\u03c4\u03ae \u03b7 \u03b4\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03af\u03b1 \u03b5\u03bd\u03cc\u03c2 listen socket
+sfwTest = \u03b1\u03c0\u03bb\u03ae \u03b4\u03bf\u03ba\u03b9\u03bc\u03ae \u03b3\u03b9\u03b1 firewall...
+sfwWrongMessage = \u03b1\u03c0\u03bb\u03ae \u03b4\u03bf\u03ba\u03b9\u03bc\u03ae \u03b3\u03b9\u03b1 firewall: \u039b\u03ac\u03b8\u03bf\u03c2 \u03c4\u03cd\u03c0\u03bf\u03c2 \u03bc\u03b7\u03bd\u03cd\u03bc\u03b1\u03c4\u03bf\u03c2
+showOptions = \u0395\u03bc\u03c6\u03ac\u03bd\u03b9\u03c3\u03b7 \u03b5\u03c0\u03b9\u03bb\u03bf\u03b3\u03ce\u03bd
+simpleFirewall = \u0391\u03c0\u03bb\u03cc firewall
+sleep10m = \u03b4\u03b9\u03ac\u03bb\u03b5\u03b9\u03bc\u03bc\u03b1 \u03b3\u03b9\u03b1 10 \u03bb\u03b5\u03c0\u03c4\u03ac...
+sleep1m = \u03b4\u03b9\u03ac\u03bb\u03b5\u03b9\u03bc\u03bc\u03b1 \u03b3\u03b9\u03b1 1 \u03bb\u03b5\u03c0\u03c4\u03cc...
+sleep30m = \u03b4\u03b9\u03ac\u03bb\u03b5\u03b9\u03bc\u03bc\u03b1 \u03b3\u03b9\u03b1 30 \u03bb\u03b5\u03c0\u03c4\u03ac...
+sleep5m = \u03b4\u03b9\u03ac\u03bb\u03b5\u03b9\u03bc\u03bc\u03b1 \u03b3\u03b9\u03b1 5 \u03bb\u03b5\u03c0\u03c4\u03ac...
+sleep12h = \u03b4\u03b9\u03ac\u03bb\u03b5\u03b9\u03bc\u03bc\u03b1 \u03b3\u03b9\u03b1 12 \u03ce\u03c1\u03b5\u03c2...
+sleep1d = \u03b4\u03b9\u03ac\u03bb\u03b5\u03b9\u03bc\u03bc\u03b1 \u03b3\u03b9\u03b1 1 \u03bc\u03ad\u03c1\u03b1...
+sleep2h = \u03b4\u03b9\u03ac\u03bb\u03b5\u03b9\u03bc\u03bc\u03b1 \u03b3\u03b9\u03b1 2 \u03ce\u03c1\u03b5\u03c2...
+start = \u0388\u039d\u0391\u03a1\u039e\u0397
+startingTest = \u0388\u03bd\u03b1\u03c1\u03be\u03b7 \u03bc\u03ad\u03c4\u03c1\u03b7\u03c3\u03b7\u03c2
+statistics = \u03a3\u03c4\u03b1\u03c4\u03b9\u03c3\u03c4\u03b9\u03ba\u03ac
+stop = \u03a3\u03a4\u039f\u03a0
+stopped = \u039f\u03b9 \u03bc\u03b5\u03c4\u03c1\u03ae\u03c3\u03b5\u03b9\u03c2 \u03c3\u03c4\u03b1\u03bc\u03b1\u03c4\u03ae\u03b8\u03b7\u03ba\u03b1\u03bd!
+stopping = \u0394\u03b9\u03b1\u03ba\u03bf\u03c0\u03ae...
+systemFault = \u039b\u03ac\u03b8\u03bf\u03c2 \u03c3\u03c5\u03c3\u03c4\u03ae\u03bc\u03b1\u03c4\u03bf\u03c2
+test = \u039c\u03ad\u03c4\u03c1\u03b7\u03c3\u03b7
+testsuiteWrongMessage = \u0394\u03b9\u03b1\u03c0\u03c1\u03b1\u03b3\u03bc\u03ac\u03c4\u03b5\u03c5\u03c3\u03b7 \u03c4\u03bf\u03c5 \u03c3\u03c5\u03bd\u03cc\u03bb\u03bf\u03c5 \u03c4\u03c9\u03bd \u03b4\u03bf\u03ba\u03b9\u03bc\u03ce\u03bd: \u039b\u03ac\u03b2\u03b1\u03bc\u03b5 \u03bb\u03ac\u03b8\u03bf\u03c2 \u03c4\u03cd\u03c0\u03bf \u03bc\u03b7\u03bd\u03cd\u03bc\u03b1\u03c4\u03bf\u03c2
+theSlowestLink = \u0397 \u03c0\u03b9\u03bf \u03b1\u03c1\u03b3\u03ae \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7 \u03c3\u03b5 \u03bf\u03bb\u03cc\u03ba\u03bb\u03b7\u03c1\u03b7 \u03c4\u03b7\u03bd \u03b4\u03b9\u03b1\u03b4\u03c1\u03bf\u03bc\u03ae \u03b5\u03af\u03bd\u03b1\u03b9 \u03ad\u03bd\u03b1
+theoreticalLimit = \u03a4\u03bf \u03b8\u03b5\u03c9\u03c1\u03b7\u03c4\u03b9\u03ba\u03cc \u03cc\u03c1\u03b9\u03bf \u03c4\u03bf\u03c5 \u03b4\u03b9\u03ba\u03c4\u03cd\u03bf\u03c5 \u03b5\u03af\u03bd\u03b1\u03b9
+thisConnIs = \u0391\u03c5\u03c4\u03ae \u03b7 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7 \u03b5\u03af\u03bd\u03b1\u03b9
+timesPktLoss = \u03c6\u03bf\u03c1\u03ad\u03c2 \u03bb\u03cc\u03b3\u03c9 \u03b1\u03c0\u03ce\u03bb\u03b5\u03b9\u03b1\u03c2 \u03c0\u03b1\u03ba\u03ad\u03c4\u03c9\u03bd
+toMaximizeThroughput = kbytes \u03b3\u03b9\u03b1 \u03bc\u03b5\u03b3\u03b9\u03c3\u03c4\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7 \u03c4\u03b7\u03c2 \u03c4\u03b1\u03c7\u03cd\u03c4\u03b7\u03c4\u03b1\u03c2 \u03b4\u03b9\u03b1\u03bc\u03b5\u03c4\u03b1\u03b3\u03c9\u03b3\u03ae\u03c2
+troubleReportFrom = \u0391\u03bd\u03b1\u03c6\u03bf\u03c1\u03ac \u03c3\u03c6\u03ac\u03bb\u03bc\u03b1\u03c4\u03bf\u03c2 \u03b1\u03c0\u03cc \u03c4\u03bf NDT \u03c3\u03c4\u03bf\u03bd
+unableToDetectBottleneck = \u039f \u03b5\u03be\u03c5\u03c0\u03b7\u03c1\u03b5\u03c4\u03b7\u03c4\u03ae\u03c2 \u03b4\u03b5\u03bd \u03ba\u03b1\u03c4\u03ac\u03c6\u03b5\u03c1\u03b5 \u03bd\u03b1 \u03ba\u03b1\u03c4\u03b1\u03bb\u03ac\u03b2\u03b5\u03b9 \u03c4\u03bf\u03bd \u03c4\u03cd\u03c0\u03bf \u03c4\u03b7\u03c2 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7\u03c2 \u03c0\u03bf\u03c5 \u03c0\u03b5\u03c1\u03b9\u03bf\u03c1\u03af\u03b6\u03b5\u03b9 \u03c4\u03bf \u03b5\u03cd\u03c1\u03bf\u03c2 \u03b6\u03ce\u03bd\u03b7\u03c2.
+unableToObtainIP = \u0391\u03b4\u03cd\u03bd\u03b1\u03c4\u03bf \u03bd\u03b1 \u03b2\u03c1\u03b5\u03b8\u03b5\u03af \u03b7 \u03c4\u03bf\u03c0\u03b9\u03ba\u03ae \u03b4\u03b9\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7 IP
+unknownID = \u0386\u03b3\u03bd\u03c9\u03c3\u03c4\u03bf ID \u03bc\u03ad\u03c4\u03c1\u03b7\u03c3\u03b7\u03c2
+unknownServer = \u0386\u03b3\u03bd\u03c9\u03c3\u03c4\u03bf\u03c2 \u03b5\u03be\u03c5\u03c0\u03b7\u03c1\u03b5\u03c4\u03b7\u03c4\u03ae\u03c2
+unsupportedClient = \u03a0\u03bb\u03b7\u03c1\u03bf\u03c6\u03bf\u03c1\u03af\u03b1: \u039f \u03b5\u03be\u03c5\u03c0\u03b7\u03c1\u03b5\u03c4\u03b7\u03c4\u03ae\u03c2 \u03b4\u03b5\u03bd \u03c5\u03c0\u03bf\u03c3\u03c4\u03b7\u03c1\u03af\u03b6\u03b5\u03b9 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf\u03bd \u03c0\u03b5\u03bb\u03ac\u03c4\u03b7 cli
+vendor = \u039a\u03b1\u03c4\u03b1\u03c3\u03ba\u03b5\u03c5\u03b1\u03c3\u03c4\u03ae\u03c2
+version = \u0388\u03ba\u03b4\u03bf\u03c3\u03b7
+versionWrongMessage = \u0394\u03b9\u03b1\u03c0\u03c1\u03b1\u03b3\u03bc\u03ac\u03c4\u03b5\u03c5\u03c3\u03b7 \u03ad\u03ba\u03b4\u03bf\u03c3\u03b7\u03c2 \u03c4\u03bf\u03c5 NDT: \u039b\u03ac\u03b2\u03b1\u03bc\u03b5 \u03bb\u03ac\u03b8\u03bf\u03c2 \u03c4\u03cd\u03c0\u03bf\u03c5 \u03bc\u03b7\u03bd\u03cd\u03bc\u03b1\u03c4\u03bf\u03c2
+web100Details = Web100 \u039b\u03b5\u03c0\u03c4\u03bf\u03bc\u03b5\u03c1\u03ae\u03c2 \u03b1\u03bd\u03ac\u03bb\u03c5\u03c3\u03b7
+web100KernelVar = WEB100 \u039c\u03b5\u03c4\u03b1\u03b2\u03bb\u03b7\u03c4\u03ad\u03c2 \u03c4\u03bf\u03c5 \u03c0\u03c5\u03c1\u03ae\u03bd\u03b1
+web100Stats = \u03a3\u03c4\u03b1\u03c4\u03b9\u03c3\u03c4\u03b9\u03ba\u03ac \u03bc\u03ad\u03c3\u03c9 \u03c4\u03bf\u03c5 WEB100
+web100Var = \u039c\u03b5\u03c4\u03b1\u03b2\u03bb\u03b7\u03c4\u03ad\u03c2 Web100
+web100rtt = To Web100 \u03b1\u03bd\u03b1\u03c6\u03ad\u03c1\u03b5\u03b9 \u03cc\u03c4\u03b9 \u03bf \u03c7\u03c1\u03cc\u03bd\u03bf\u03c2 \u03b1\u03c0\u03cc\u03ba\u03c1\u03b9\u03c3\u03b7\u03c2 (Round trip time)
+web100tcpOpts = To Web100 \u03b1\u03bd\u03b1\u03c6\u03ad\u03c1\u03b5\u03b9 \u03cc\u03c4\u03b9 \u03c4\u03bf TCP \u03c7\u03c1\u03b7\u03c3\u03b9\u03bc\u03bf\u03c0\u03bf\u03b9\u03b5\u03af \u03c4\u03b9\u03c2 \u03b5\u03be\u03ae\u03c2 \u03c1\u03c5\u03b8\u03bc\u03af\u03c3\u03b5\u03b9\u03c2:
+willImprove = \u03b8\u03b1 \u03b2\u03b5\u03bb\u03c4\u03b9\u03ce\u03c3\u03b5\u03b9 \u03c4\u03b7\u03bd \u03b5\u03c0\u03af\u03b4\u03bf\u03c3\u03b7
+workstation = \u03a3\u03c4\u03b1\u03b8\u03bc\u03cc\u03c2 \u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1\u03c2
+your = \u03a4\u03bf \u03b4\u03b9\u03ba\u03cc \u03c3\u03b1\u03c2
+yourPcHas = \u039f \u03c5\u03c0\u03bf\u03bb\u03bf\u03b3\u03b9\u03c3\u03c4\u03ae\u03c2 \u03c3\u03b1\u03c2 \u03ad\u03c7\u03b5\u03b9
+connectingTo = \u03a3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7 \u03c3\u03c4\u03bf
+toRunTest = to run test
+t1Str = T1
+t3Str = T3;
+ethernetStr = Ethernet
+fastEthernet = FastE
+oc12Str = OC-12
+gigabitEthernetStr = GigE
+oc48Str = OC-48
+tengigabitEthernetStr = 10 Gig
+systemFaultStr = systemFault
+dialupStr = dialup2
+rttStr = rtt
=======================================
--- /dev/null
+++ /trunk/flash-client/src/locale/en_US/DisplayMessages.properties Sun Feb 2 19:14:17 2014 UTC
@@ -0,0 +1,235 @@
+10gbps = 10 Gbps 10 Gigabit Ethernet/OC-192 subnet
+10mbps = 10 Mbps Ethernet subnet
+10mins = 10 mins
+12hours = 12 hours
+1day = 1 day
+1gbps = 1.0 Gbps Gigabit Ethernet subnet
+1min = 1 min
+2.4gbps = 2.4 Gbps OC-48 subnet
+2hours = 2 hours
+30mins = 30 mins
+45mbps = 45 Mbps T3/DS3 subnet
+5mins = 5 mins
+622mbps = a 622 Mbps OC-12 subnet
+and = and
+architecture = Architecture
+bytes = Bytes
+c2s = C2S
+c2sPacketQueuingDetected = [C2S]: Packet queueing detected
+c2sThroughput = C2S throughput
+c2sThroughputFailed = C2S throughput test FAILED!
+cabledsl = Cable/DSL modem
+cablesNok = Warning: excessive network errors, check network cable(s)
+cablesOk = Good network cable(s) found
+checkingFirewalls = Checking for firewalls . . . . . . . . . . . . . . . . . . .
+checkingMiddleboxes = Checking for Middleboxes . . . . . . . . . . . . . . . . . .
+clickStart = Click START to start the test
+clickStart2 = Click START to re-test
+client = Client
+client2 = Client
+clientAcksReport = Client Acks report link is
+clientDataReports = Client Data reports link is
+clientInfo = Client System Details
+clientIpModified = Information: Network Address Translation (NAT) box is modifying the Client's IP address
+clientIpNotFound = Client IP address not found. For IE users, modify the Java parameters\n click Tools - Internet Options - Security - Custom Level, scroll down to\n Microsoft VM - Java permissions and click Custom, click Java Custom Settings\n Edit Permissions - Access to all Network Addresses, click Eanble and save changes
+clientIpPreserved = Client IP addresses are preserved End-to-End
+clientSays = but Client says
+close = Close
+comments = Comments
+congestNo = No network congestion discovered.
+congestYes = Information: throughput is limited by other network traffic.
+connIdle = The connection was idle
+connStalled = The connection stalled
+connected = Connected to:
+connectedTo = is connected to a
+copy = Copy
+defaultTests = Default tests
+delayBetweenTests = Delay between tests
+detailedStats = Detailed Statistics
+dialup = Dial-up Modem
+dialup2 = Dial-up
+done = Done.
+done2 = Tcpbw100 done
+dupAcksIn = duplicate acks received
+duplexFullHalf = Alarm: Duplex Mismatch condition detected Switch=Full and Host=half
+duplexHalfFull = Alarm: Duplex Mismatch condition detected Switch=half and Host=full
+duplexNok = Warning: Old Duplex mismatch condition detected:
+duplexOk = Normal duplex operation found.
+endOfEmail = End Of Email Message
+excLoss = Excessive packet loss is impacting your performance, check the auto-negotiate function on your local PC and network switch
+excessiveErrors = Alarm: Excessive errors, check network cable(s).
+firewallNo = is not behind a firewall. [Connection to the ephemeral port was successful]
+firewallYes = is probably behind a firewall. [Connection to the ephemeral port failed]
+flowControlLimits = The network based flow control limits the throughput to
+found100mbps = 100 Mbps FastEthernet link found.
+found10gbps = 10 Gbps 10 GigEthernet/OC-192 link found.
+found10mbps = 10 Mbps Ethernet link found.
+found1gbps = 1 Gbps GigabitEthernet link found.
+found2.4gbps = 2.4 Gbps OC-48 link found.
+found45mbps = 45 Mbps T3/DS3 link found.
+found622mbps = 622 Mbps OC-12 link found.
+foundDialup = Dial-up modem link found.
+foundDsl = Cable modem/DSL/T1 link found.
+fullDuplex = Full duplex Fast Ethernet subnet
+general = General
+generatingReport = Generating Trouble Report: This report will be emailed to the person you specify
+getWeb100Var = Get WEB100 Variables
+halfDuplex = Half duplex Fast Ethernet subnet
+id = TCP/Web100 Network Diagnostic Tool
+immediate = immediate
+inboundTest = Tcpbw100 inbound test...
+inboundWrongMessage = C2S throughput test: Received wrong type of the message
+incompatibleVersion = Incompatible version number
+incrRxBuf = Increasing the the client's receive buffer
+incrTxBuf = Increasing the NDT server's send buffer
+information = Information
+initialization = Initialization...
+insufficient = Insufficent data collected to determine link type.
+invokingMailtoFunction = Tcpbw100 Invoking Mailto function
+ipProtocol = IP protocol
+ipcFail = Interprocess communications failed, unknown link type.
+usingIpv4 = -- Using IPv4 address
+usingIpv6 = -- Using IPv6 address
+javaData = Java data
+kbyteBufferLimits = KByte buffer which limits the throughput to
+limitNet = network limited
+limitRx = receiver limited
+limitTx = sender limited
+linkFullDpx = Link set to Full Duplex mode
+linkHalfDpx = Link set to Half Duplex mode
+loggingWrongMessage = Logging to server: Received wrong type of the message
+lookupError = Unable to obtain remote IP address
+mboxWrongMessage = Middlebox test: Received wrong type of the message
+meta = META
+metaFailed = META test FAILED!
+metaTest = META test...
+metaWrongMessage = META test: Received wrong type of the message
+middlebox = Middlebox
+middleboxFail = Server Failed while middlebox testing
+middleboxFail2 = Middlebox test FAILED!
+middleboxModifyingMss = Information: Network Middlebox is modifying MSS variable
+middleboxTest = Tcpbw100 Middlebox test...
+moreDetails = More Details...
+name = Name
+ndtServerHas = The NDT server has a
+noPktLoss1 = No packet loss
+noPktLoss2 = No packet loss was observed
+numberOfTests = Number of tests
+of = of
+off = OFF
+ok = OK
+oldDuplexMismatch = "Warning: Old Duplex mismatch condition detected: "
+on = ON
+ooOrder = but packets arrived out-of-order
+options = Options
+osData = OS data:
+otherClient = Another client is currently being served, your test will begin within
+otherTraffic = Information: Other network traffic is congesting the link
+outboundTest = Tcpbw100 outbound test...
+outboundWrongMessage = C2S throughput test: Received wrong type of the message
+packetQueuing = Packet queuing
+packetQueuingInfo = TCP (Transmission Control Protocol) reliably transfers data between two\n Internet hosts. It automatically detects and recovers from errors and\n losses. TCP uses buffers to provide this reliability. In addition,\n switches and routers use buffers to handle cases where multiple input\n links send packets to a single output link or link speeds change\n (FastEthernet to DSL modem).\n\n The NDT server generates and sends 10 seconds of data to the client. In\n some cases the server can generate data faster than it can send packets\n into the network (e.g., a 2 GHz CPU sending to a DSL connected client).\n When this happens, some packets may remain in the server output queue\n when the 10 second timer expires. TCP will automatically continue to\n send these queued packets and the client will continue to accept and\n process these incoming packets. This will result in the client test\n running longer than expected.\n\n This condition has occurred during this test. No action is required to\n resolve this issue.
+packetSizePreserved = Packet size is preserved End-to-End
+packetsize = the Packet size
+pc = PC
+pctOfTime = % of the time
+performedTests = Performed tests
+pktsRetrans = packets retransmitted
+possibleDuplexFullHalf = Alarm: Possible Duplex Mismatch condition detected Switch=Full and Host=half
+possibleDuplexHalfFull = Alarm: Possible Duplex Mismatch condition detected Switch=half and Host=full
+possibleDuplexHalfFullWarning = Warning: Possible Duplex Mismatch condition detected Switch=half and Host=full
+preferIPv6 = prefer IPv6
+printDetailedStats = Print Detailed Statistics
+protocolError = Protocol error! Expected 'prepare', got: 0x
+qSeen = throughput test: Packet queuing detected
+ready = Tcpbw100 ready
+receiveBufferShouldBe = Information: The receive buffer should be
+receiving = Receiving results...
+reportProblem = Report problem
+resultsParseError = Error parsing test results!
+resultsTimeout = Warning! Client time-out while reading data, possible duplex mismatch exists
+resultsWrongMessage = Tests results: Received wrong type of the message
+rtt = RTT
+rttFail = Link detection algorithm failed due to excessive Round Trip Times.
+runningInboundTest = running 10s inbound test (server-to-client [S2C]) . . . . . .
+runningOutboundTest = running 10s outbound test (client-to-server [C2S]) . . . . .
+s2c = S2C
+s2cPacketQueuingDetected = [S2C]: Packet queueing detected
+s2cThroughput = S2C throughput
+s2cThroughputFailed = S2C throughput test FAILED!
+sackReceived = SACK blocks received
+scalingFactors = Scaling Factors
+seconds = seconds
+sendingMetaInformation = Sending META information . . . . . . . . . . . . . . . . . . .
+server = Server
+serverAcksReport = Server Acks report link is
+serverFault = Server Fault: unknown fault occurred. Please try again later
+serverBusy = Server Busy: Too many clients waiting in server queue. Please try again later
+serverBusy15s = Server Busy: Please wait 15 seconds for previous test to finish
+serverBusy30s = Server busy: Please wait 30 seconds for previous test to finish
+serverBusy60s = Server Busy: Please wait 60 seconds for previous test to finish
+serverDataReports = Server Data reports link is
+serverFail = Server failed while receiving data
+serverIpModified = Information: Network Address Translation (NAT) box is modifying the Client's IP address
+serverIpPreserved = Server IP addresses are preserved End-to-End
+serverNotRunning = Server process not running: start web100srv process on remote server
+serverSays = Server says
+sfwFail = Simple firewall test FAILED!
+sfwSocketFail = Simple firewall test: Cannot create listen socket
+sfwTest = Simple firewall test...
+sfwWrongMessage = Simple firewall test: Received wrong type of the message
+showOptions = Show options
+simpleFirewall = Simple firewall
+sleep10m = Sleeping for 10 mins...
+sleep1m = Sleeping for 1 min...
+sleep30m = Sleeping for 30 mins...
+sleep5m = Sleeping for 5 mins...
+sleep12h = Sleeping for 12 hours...
+sleep1d = Sleeping for 1 day...
+sleep2h = Sleeping for 2 hours...
+start = START
+startingTest = Starting test
+statistics = Statistics
+stop = STOP
+stopped = The tests were stopped!
+stopping = Stopping...
+systemFault = System Fault
+test = Test
+testsuiteWrongMessage = Negotiating test suite: Received wrong type of the message
+theSlowestLink = The slowest link in the end-to-end path is a
+theoreticalLimit = The theoretical network limit is
+thisConnIs = This connection is
+timesPktLoss = times due to packet loss
+toMaximizeThroughput = kbytes to maximize throughput
+troubleReportFrom = Trouble Report from NDT on
+unableToDetectBottleneck = Server unable to determine bottleneck link type.
+unableToObtainIP = Unable to obtain local IP address
+unknownID = Unknown test ID
+unknownServer = Unknown server
+unsupportedClient = Information: The server does not support this command line client
+vendor = Vendor
+version = Version
+versionWrongMessage = Negotiating NDT version: Received wrong type of the message
+web100Details = Web100 Detailed Analysis
+web100KernelVar = WEB100 Kernel Variables
+web100Stats = WEB100 Enabled Statistics
+web100Var = Web100 Variables
+web100rtt = Web100 reports the Round trip time
+web100tcpOpts = Web100 reports TCP negotiated the optional Performance Settings to:
+willImprove = will improve performance
+workstation = Workstation
+your = Your
+yourPcHas = Your PC/Workstation has a
+connectingTo = Connecting to
+toRunTest = to run test
+t1Str = T1
+t3Str = T3;
+ethernetStr = Ethernet
+fastEthernet = FastE
+oc12Str = OC-12
+gigabitEthernetStr = GigE
+oc48Str = OC-48
+tengigabitEthernetStr = 10 Gig
+systemFaultStr = systemFault
+dialupStr = dialup2
+rttStr = rtt
=======================================
--- /dev/null
+++ /trunk/flash-client/src/locale/fr_FR/DisplayMessages.properties Sun Feb 2 19:14:17 2014 UTC
@@ -0,0 +1,235 @@
+10gbps = sous-r\u00E9seau 10 Gbps 10 Gigabit Ethernet/OC-192
+10mbps = sous-r\u00E9seau 10 Mbps Ethernet
+10mins = 10 minutes
+12hours = 12 heures
+1day = 1 jour
+1gbps = sous-r\u00E9seau 1.0 Gbps Gigabit Ethernet
+1min = 1 minute
+2.4gbps = sous-r\u00E9seau 2.4 Gbps OC-48
+2hours = 2 heures
+30mins = 30 minutes
+45mbps = sous-r\u00E9seau 45 Mbps T3/DS3
+5mins = 5 minutes
+622mbps = sous-r\u00E9seau 622 Mbps OC-12
+and = et
+architecture = Architecture
+bytes = Bytes
+c2s = C2S
+c2sPacketQueuingDetected = [C2S]: D\u00E9tection de mise en file d'attente de paquets
+c2sThroughput = d\u00E9bit C2S
+c2sThroughputFailed = test de d\u00E9bit C2S \u00C9CHOU\u00C9!
+cabledsl = modem C\u00E2ble/DSL
+cablesNok = Attention: trop d'erreurs r\u00E9seau, v\u00E9rifiez le(s) c\u00E2ble(s) r\u00E9seau
+cablesOk = Bon(s) c\u00E2ble(s) r\u00E9seau trouv\u00E9s
+checkingFirewalls = V\u00E9rification de pr\u00E9sence de Firewalls . . . . . . . . . . . . . . . . . . .
+checkingMiddleboxes = V\u00E9rification de pr\u00E9sence de Middleboxes . . . . . . . . . . . . . . . . . .
+clickStart = Cliquez sur D\u00C9MARRER pour commencer le test
+clickStart2 = Cliquez sur D\u00C9MARRER pour re-tester
+client = Client
+client2 = Client
+clientAcksReport = Le lien des Acks clients est
+clientDataReports = Le lien des rapports de donn\u00E9es client est
+clientInfo = D\u00E9tails du syst\u00E8me client
+clientIpModified = Information: un \u00E9quipement Network Address Translation (NAT) modifie l'adresse IP du client
+clientIpNotFound = L'adresse IP du client non trouv\u00E9e. Pour les utilisateurs IE, modifiez les param\u00E8tres Java \n Cliquez sur Outils - Options Internet - S\u00E9curit\u00E9 - Niveau personnalis\u00E9, descendez jusqu'\u00E0\n Microsoft VM - permissions Java et cliquez sur Personnalis\u00E9, cliquez sur Param\u00E8tres Java personnalis\u00E9s\n \u00C9diter les permissions - Acc\u00E8s \u00E0 toutes les adresses r\u00E9seau, cliquez sur Appliquer et sauvegardez
+clientIpPreserved = Les adresses IP serveur sont pr\u00E9serv\u00E9es de bout en bout
+clientSays = mais le Client dit
+close = Fermez
+comments = Commentaires
+congestNo = Aucune congestion r\u00E9seau d\u00E9tect\u00E9e.
+congestYes = Information: le d\u00E9bit est limit\u00E9 par d'autres flux r\u00E9seau.
+connIdle = La connexion a \u00E9t\u00E9 oisive
+connStalled = La connexion a \u00E9t\u00E9 suspendue
+connected = Connect\u00E9 \u00E0:
+connectedTo = est connect\u00E9 \u00E0 un
+copy = Copiez
+defaultTests = Tests par d\u00E9faut
+delayBetweenTests = D\u00E9lai entre les tests
+detailedStats = Statistiques d\u00E9taill\u00E9es
+dialup = Dial-up Modem
+dialup2 = Dial-up
+done = R\u00E9alis\u00E9.
+done2 = Tcpbw100 r\u00E9alis\u00E9
+dupAcksIn = r\u00E9ception de acks en doublon
+duplexFullHalf = Alerte: condition de duplex mismatch d\u00E9tect\u00E9e, commutateur=full et h\u00F4te=half
+duplexHalfFull = Alerte: condition de duplex mismatch d\u00E9tect\u00E9e, commutateur=half et h\u00F4te=full
+duplexNok = Attention: condition de vieux duplex mismatch d\u00E9tect\u00E9e:
+duplexOk = Op\u00E9ration normale du duplex d\u00E9tect\u00E9e.
+endOfEmail = Fin de message e-mail
+excLoss = Une perte de paquets excessive diminue vos performances, v\u00E9rifiez les r\u00E9glages auto-negotiate de votre PC et du commutateur r\u00E9seau.
+excessiveErrors = Alerte: Trop d'erreurs, v\u00E9rifiez le(s) c\u00E2ble(s) r\u00E9seau.
+firewallNo = n'est pas derri\u00E8re un firewall. [Connexion vers un port \u00E9ph\u00E9m\u00E8re r\u00E9ussie]
+firewallYes = est probablement derri\u00E8re un firewall. [Connexion vers un port \u00E9ph\u00E9m\u00E8re \u00E9chou\u00E9e]
+flowControlLimits = Le contr\u00F4le de flux du r\u00E9seau limite le d\u00E9bit \u00E0
+found100mbps = Lien 100 Mbps FastEthernet d\u00E9tect\u00E9.
+found10gbps = Lien 10 Gbps 10 GigEthernet/OC-192 d\u00E9tect\u00E9.
+found10mbps = Lien 10 Mbps Ethernet d\u00E9tect\u00E9.
+found1gbps = Lien 1 Gbps GigabitEthernet d\u00E9tect\u00E9.
+found2.4gbps = Lien 2.4 Gbps OC-48 d\u00E9tect\u00E9.
+found45mbps = Lien 45 Mbps T3/DS3 d\u00E9tect\u00E9.
+found622mbps = Lien 622 Mbps OC-12 d\u00E9tect\u00E9.
+foundDialup = Lien modem Dial-up d\u00E9tect\u00E9.
+foundDsl = Lien C\u00E2ble modem/DSL/T1 d\u00E9tect\u00E9.
+fullDuplex = Full duplex Fast Ethernet subnet
+general = G\u00E9n\u00E9ral
+generatingReport = G\u00E9n\u00E9ration du rapport d'incident: Ce rapport sera envoy\u00E9 \u00E0 la personne sp\u00E9cifi\u00E9e
+getWeb100Var = R\u00E9cup\u00E9rer les variables WEB100
+halfDuplex = Half duplex Fast Ethernet subnet
+id = Outil de diagnostics r\u00E9seau TCP/Web100
+immediate = imm\u00E9diat
+inboundTest = test d'entr\u00E9e Tcpbw100...
+inboundWrongMessage = Test de d\u00E9bit C2S : r\u00E9ception du mauvais type de message
+incompatibleVersion = Num\u00E9ro de version incompatible
+incrRxBuf = Agrandissement du tampon de r\u00E9ception client
+incrTxBuf = Agrandissement du tampon d'\u00E9mission du serveur NDT
+information = Information
+initialization = Initialisation...
+insufficient = Trop peu de donn\u00E9es collect\u00E9es pour d\u00E9terminer le type de lien.
+invokingMailtoFunction = Tcpbw100 Appel de la fonction Mailto
+ipProtocol = Protocole IP
+ipcFail = Communication inter-processus \u00E9chou\u00E9e, type de lien inconnu.
+usingIpv4 = -- Utilisation de l'adresse IPv4
+usingIpv6 = -- Utilisation de l'adresse IPv6
+javaData = Donn\u00E9es Java
+kbyteBufferLimits = KByte tampon, ce qui limite le d\u00E9bit \u00E0
+limitNet = limit\u00E9 par le r\u00E9seau
+limitRx = limit\u00E9 par le r\u00E9cepteur
+limitTx = limit\u00E9 par l'\u00E9metteur
+linkFullDpx = Lien r\u00E9gl\u00E9 en mode Full Duplex
+linkHalfDpx = Lien r\u00E9gl\u00E9 en mode Half Duplex
+loggingWrongMessage = Enregistrement aupr\u00E8s du serveur: r\u00E9ception du mauvais type de message
+lookupError = Impossible d'obtenir l'adresse IP distante
+mboxWrongMessage = Test de middlebox : r\u00E9ception du mauvais type de message
+meta = META
+metaFailed = META test FAILED!
+metaTest = META test...
+metaWrongMessage = META test: Received wrong type of the message
+middlebox = Middlebox
+middleboxFail = \u00C9chec du serveur lors du test de middlebox
+middleboxFail2 = Test de middlebox \u00C9CHOU\u00C9!
+middleboxModifyingMss = Information: le Middlebox modifie la variable MSS
+middleboxTest = Tcpbw100 test de Middlebox...
+moreDetails = Plus de d\u00E9tails...
+name = Nom
+ndtServerHas = Le serveur NDT a un
+noPktLoss1 = Pas de perte de paquets
+noPktLoss2 = Aucune perte de paquets n'a \u00E9t\u00E9 observ\u00E9e
+numberOfTests = Nombre de tests
+of = de
+off = OFF
+ok = OK
+oldDuplexMismatch = "Attention: condition de vieux duplex mismatch d\u00E9tect\u00E9e: "
+on = ON
+ooOrder = mais les paquets sont arriv\u00E9s dans le d\u00E9sordre
+options = Options
+osData = Donn\u00E9es de l'OS:
+otherClient = Un autre client est actuellement en train d'\u00EAtre servi, votre test commencera dans
+otherTraffic = Information: d'autres flux r\u00E9seaux congestionnent le lien
+outboundTest = Tcpbw100 test de sortie ...
+outboundWrongMessage = Test de d\u00E9bit C2S : R\u00E9ception du mauvais type de message
+packetQueuing = Mise en file d'attente de paquets
+packetQueuingInfo = TCP (Transmission Control Protocol) transf\u00E8re des donn\u00E9es de mani\u00E8re fiable entre deux\n h\u00F4tes Internet. Il d\u00E9tecte et r\u00E9cup\u00E8re automatiquement les erreurs et\n pertes. TCP utilise des tampons pour fournir cette fiabilit\u00E9. De plus,\n des commutateurs et routeurs utilisent des tampons pour g\u00E9rer les cas dans lesquels plusieurs liens\n d'entr\u00E9e envoient des paquets \u00E0 un seul lien de sortie ou lorsque la vitesse des liens est diff\u00E9rente\n (FastEthernet vers un modem DSL).\n\n Le serveur NDT g\u00E9n\u00E8re et envoie 10 secondes de donn\u00E9es au client. Dans\n certains cas le serveur peut produire des donn\u00E9es plus vite qu'il ne peut envoyer les paquets\n vers le r\u00E9seau (p.e., un CPU de 2 GHz \u00E9mettant vers un client connect\u00E9 en DSL).\n Quand cela arrive, certains paquets peuvent rester dans la file d'attente de sortie du serveur\n lorsque la minuterie de 10 secondes se termine. TCP continuera automatiquement \n d'envoyer ces paquets en file d'attente et le client continuera \u00E0 les accepter et\n \u00E0 g\u00E9rer ces paquets entrants. Ceci aura pour r\u00E9sultat que le test client\n dure plus longtemps que pr\u00E9vu.\n\n Cette condition s'est r\u00E9alis\u00E9e durant ce test. Aucune action n'est n\u00E9cessaire pour r\u00E9soudre ce probl\u00E8me.
+packetSizePreserved = La taille des paquets est pr\u00E9serv\u00E9e de bout-en-bout
+packetsize = La taille des paquets
+pc = PC
+pctOfTime = % du temps
+performedTests = Tests r\u00E9alis\u00E9s
+pktsRetrans = paquets retransmis
+possibleDuplexFullHalf = Alerte: condition de duplex mismatch possible d\u00E9tect\u00E9e, commutateur=full et h\u00F4te=half
+possibleDuplexHalfFull = Alerte: condition de duplex mismatch possible d\u00E9tect\u00E9e, commutateur=half et h\u00F4te=full
+possibleDuplexHalfFullWarning = Attention: condition de duplex mismatch possible d\u00E9tect\u00E9e, commutateur=half et h\u00F4te=full
+preferIPv6 = pr\u00E9f\u00E9rer IPv6
+printDetailedStats = Afficher les statistiques d\u00E9taill\u00E9es
+protocolError = Erreur de protocole! Attendait 'prepare', re\u00E7u: 0x
+qSeen = test de d\u00E9bit: Mise en file d'attente de paquets d\u00E9tect\u00E9e
+ready = Tcpbw100 pr\u00EAt
+receiveBufferShouldBe = Information: Le tampon de r\u00E9ception devrait \u00EAtre
+receiving = Reception des r\u00E9sultats...
+reportProblem = Rapporter un probl\u00E8me
+resultsParseError = Erreur lors du traitement des r\u00E9sultats!
+resultsTimeout = Attention! D\u00E9passement du d\u00E9lai client lors de la lecture des donn\u00E9es, il y a peut-\u00EAtre un probl\u00E8me de duplex mismatch
+resultsWrongMessage = R\u00E9sultat des tests: r\u00E9ception du mauvais type de message
+rtt = RTT
+rttFail = L'algorithme de d\u00E9tection du lien a \u00E9chou\u00E9 \u00E0 cause d'un temps d'aller-retour (RTT) trop important.
+runningInboundTest = ex\u00E9cution du test d'entr\u00E9e de 10 secondes (server-to-client [S2C]) . . . . . .
+runningOutboundTest = ex\u00E9cution du test de sortie de 10s (client-to-server [C2S]) . . . . .
+s2c = S2C
+s2cPacketQueuingDetected = [S2C]: D\u00E9tection de mise en file d'attente de paquets
+s2cThroughput = d\u00E9bit S2C
+s2cThroughputFailed = Test de d\u00E9bit S2C \u00C9CHOU\u00C9!
+sackReceived = Blocs SACK re\u00E7us
+scalingFactors = Facteurs d'\u00E9chelle
+seconds = secondes
+sendingMetaInformation = Sending META information . . . . . . . . . . . . . . . . . . .
+server = Serveur
+serverAcksReport = les Acks du serveur rapportent que le lien est
+serverFault = Erreur du serveur: une erreur inconnue a eu lieu. Veuillez re-essayer plus tard.
+serverBusy = Serveur occup\u00E9: Trop de clients attendent dans la file d'attente du serveur. Veuillez re-essayer plus tard
+serverBusy15s = Serveur occup\u00E9: Veuillez attendre 15 secondes pour que le test pr\u00E9c\u00E9dant termine
+serverBusy30s = Serveur occup\u00E9: Veuillez attendre 30 secondes pour que le test pr\u00E9c\u00E9dant termine
+serverBusy60s = Serveur occup\u00E9: Veuillez attendre 60 secondes pour que le test pr\u00E9c\u00E9dant termine
+serverDataReports = Les donn\u00E9es du serveur rapportent que le lien est
+serverFail = Erreur du serveur lors de la r\u00E9ception des donn\u00E9es
+serverIpModified = Information: un \u00E9quipement Network Address Translation (NAT) modifie l'adresse IP du client
+serverIpPreserved = Les adresses IP du serveur sont conserv\u00E9es de bout en bout
+serverNotRunning = Processus serveur non actif: d\u00E9marrez le processus web100srv sur le serveur distant
+serverSays = Le serveur dit
+sfwFail = Le simple test firewall a \u00C9CHOU\u00C9!
+sfwSocketFail = Test simple du firewall: ne peut cr\u00E9er le socket d'\u00E9coute
+sfwTest = Test simple du firewall...
+sfwWrongMessage = Test simple du firewall : r\u00E9ception du mauvais type de message
+showOptions = Afficher les options
+simpleFirewall = Simple firewall
+sleep10m = En attente pour 10 minutes...
+sleep1m = En attente pour 1 minute...
+sleep30m = En attente pour 30 minutes...
+sleep5m = En attente pour 5 minutes...
+sleep12h = En attente pour 12 heures...
+sleep1d = En attente pour 1 jour...
+sleep2h = En attente pour 2 heures...
+start = D\u00C9MARRER
+startingTest = D\u00E9marrage du test
+statistics = Statistiques
+stop = ARRETER
+stopped = Les tests ont \u00E9t\u00E9 arr\u00EAt\u00E9s !
+stopping = Arr\u00EAt...
+systemFault = System Fault
+test = Test
+testsuiteWrongMessage = Negotiating test suite: r\u00E9ception du mauvais type de message
+theSlowestLink = Le lien le plus lent sur le chemin de bout en bout est un
+theoreticalLimit = La limite th\u00E9orique du r\u00E9seau est
+thisConnIs = Cette connexion est
+timesPktLoss = fois \u00E0 cause de la perte de paquets
+toMaximizeThroughput = kbytes pour maximiser le d\u00E9bit
+troubleReportFrom = Rapport d'incident de NDT sur
+unableToDetectBottleneck = Le serveur est incapable de d\u00E9terminer le type de lien du goulot d'\u00E9tranglement.
+unableToObtainIP = Impossible d'obtenir l'adresse IP locale
+unknownID = test ID inconnu
+unknownServer = Serveur inconnu
+unsupportedClient = Information: Le serveur n'accepte pas ce client en ligne de commande
+vendor = Vendeur
+version = Version
+versionWrongMessage = Negotiating NDT version: r\u00E9ception du mauvais type de message
+web100Details = Analyse d\u00E9taill\u00E9e Web100
+web100KernelVar = Variables du noyau WEB100
+web100Stats = Statistiques activ\u00E9es WEB100
+web100Var = Variables Web100
+web100rtt = Web100 rapporte le temps d'aller-retour (RTT)
+web100tcpOpts = Web100 rapporte que TCP a n\u00E9goci\u00E9 les param\u00E8tres de performances facultatifs \u00E0 :
+willImprove = am\u00E9liorera les performances
+workstation = Poste de travail
+your = Votre
+yourPcHas = Votre PC/Poste de travail a un
+connectingTo = Connexion \u00E0
+toRunTest = Pour d\u00E9marrer le test
+t1Str = T1
+t3Str = T3;
+ethernetStr = Ethernet
+fastEthernet = FastE
+oc12Str = OC-12
+gigabitEthernetStr = GigE
+oc48Str = OC-48
+tengigabitEthernetStr = 10 Gig
+systemFaultStr = systemFault
+dialupStr = dialup2
+rttStr = rtt
=======================================
--- /dev/null
+++ /trunk/flash-client/src/locale/nb_NO/DisplayMessages.properties Sun Feb 2 19:14:17 2014 UTC
@@ -0,0 +1,235 @@
+10gbps = 10 Gbps 10 Gigabit Ethernet/OC-192-subnett
+10mbps = 10 Mbps Ethernet-subnett
+10mins = 10 mins
+12hours = 12 hours
+1day = 1 d\u00f8ygn
+1gbps = 1.0 Gbps Gigabit Ethernet-subnett
+1min = 1 min
+2.4gbps = 2.4 Gbps OC-48-subnett
+2hours = 2 timer
+30mins = 30 min
+45mbps = 45 Mbps T3/DS3-subnett
+5mins = 5 min
+622mbps = et 622 Mbps OC-12-subnett
+and = og
+architecture = Arkitektur
+bytes = byte
+c2s = K-T
+c2sPacketQueuingDetected = [K-T]: Pakkek\u00f8ing oppdaget
+c2sThroughput = K-T ytelse
+c2sThroughputFailed = K-T ytelsestest FEILET!
+cabledsl = Kabel/DSL-modem
+cablesNok = Advarsel: for mange nettverksfeil, sjekk kablene.
+cablesOk = Nettverkskablene er i orden.
+checkingFirewalls = Ser etter brannmurer . . . . . . . . . . . . . . . . . . .
+checkingMiddleboxes = Ser etter mellombokser . . . . . . . . . . . . . . . . .
+clickStart = Trykk START for \u00e5 starte testene.
+clickStart2 = Trykk START for \u00e5 teste en gang til.
+client = Klient
+client2 = Klienten
+clientAcksReport = basert p\u00e5 ack fra klienten ansl\u00e5s linken til
+clientDataReports = Basert p\u00e5 data fra klienten ansl\u00e5s linken til
+clientInfo = Opplysninger om klientmaskinen
+clientIpModified = Til orientering: Network Address Translation (NAT) forandrer klientmaskinens IP-adresse
+clientIpNotFound = IP-addressen til klientmaskinen ble ikke funnet
+clientIpPreserved = Tjenermaskinens IP-adresse blir bevart fra ende til ende
+clientSays = men klienten sier
+close = Lukk
+comments = Kommentarer
+congestNo = Overbelastning i nettet ikke funnet.
+congestYes = Til orientering: ytelsen er begrenset av annen trafikk i nettet.
+connIdle = Forbindelsen ventet
+connStalled = Forbindelsen hang
+connected = Koblet til:
+connectedTo = er koblet til et
+connectingTo = Kobler opp mot
+copy = Kopier
+defaultTests = Standardtester
+delayBetweenTests = Delay between tests
+detailedStats = Detaljer
+dialup = Oppringt modem
+dialup2 = oppringt
+done = Ferdig
+done2 = Tcpbw100 ferdig
+dupAcksIn = dupliserte ack ble mottatt
+duplexFullHalf = Alarm: Dupleksitetsfeil oppdaget; svitsj=full og maskin=halv
+duplexHalfFull = Alarm: Dupleksitetsfeil oppdaget; svitsj=halv og maskin=full
+duplexNok = Alarm: Dupleksitetsfeil:
+duplexOk = Dupleksitet er i orden.
+endOfEmail = Slutt p\u00e5 epost
+excLoss = "H\u00f8yt pakketap begrenser ytelsen, kontroller automatisk konfigurering mellom din datamaskin og nettverkssvitsjen.
+excessiveErrors = Alarm: Alvorlige pakketap, sjekk nettverkskabler.
+firewallNo = er ikke bak brannmur. [Oppn\u00e5dde forbindelse med midlertidig port]
+firewallYes = er trolig bak en brannmur . [Oppn\u00e5dde ikke forbindelse med midlertidig port]
+flowControlLimits = Flytkontroll i nettet begrenser ytelsen til
+found100mbps = Link med 100 Mbit/s FastEthernet funnet.
+found10gbps = Link med 10 Gbit/s 10 GigEthernet/OC-192 funnet.
+found10mbps = Link med 10 Mbit/s Ethernet funnet.
+found1gbps = Link med 1 Gbit/s GigabitEthernet funnet.
+found2.4gbps = Link med 2.4 Gbit/s OC-48 funnet.
+found45mbps = Link med 45 Mbit/s T3/DS3 funnet.
+found622mbps = Link med 622 Mbit/s OC-12 funnet.
+foundDialup = Link med oppringt modem funnet.
+foundDsl = Link med kabelmodem/DSL/T1 funnet.
+fullDuplex = full dupleks "Fast Ethernet"-subnett
+general = Annet
+generatingReport = Genererer feilrapport; denne vil bli sendt til personen du spesifiserer
+getWeb100Var = Viser variabler fra WEB100
+halfDuplex = Halv-dupleks "Fast Ethernet"-subnett
+id = TCP/Web100 nettverksdiagnostikkverkt\u00f8y
+immediate = umiddelbart
+inboundTest = Tcpbw100 innkommende test...
+inboundWrongMessage = Klient-til-tjener-ytelsestest: mottok feil melding
+incompatibleVersion = Inkompatibelt versjonsnummer
+incrRxBuf = \u00c5 \u00f8ke klientmaskinens mottaksbuffer
+incrTxBuf = \u00c5 \u00f8ke tjenermaskinens sendebuffer
+information = Informasjon
+initialization = Initialiserer...
+insufficient = Ikke nok data til \u00e5 bestemme type link.
+invokingMailtoFunction = Tcpbw100 sender post
+ipProtocol = IP-protokoll
+ipcFail = Feil ved kommunikasjon mellom prosesser, type link ikke bestemt.
+javaData = Opplysninger om Java
+kbyteBufferLimits = kbyte som begrenser ytelsen til
+limitNet = begrenset av nettet
+limitRx = begrenset av mottakeren
+limitTx = begrenset av senderen
+linkFullDpx = Linken er i full dupleksmodus.
+linkHalfDpx = Linken er i halv dupleksmodus.
+loggingWrongMessage = Logging til tjener: Mottok feil type melding
+lookupError = Greide ikke sl\u00e5 opp tjenerens IP-addresse
+mboxWrongMessage = Mellombokstest: Mottok feil type melding
+meta = META
+metaFailed = META test FAILED!
+metaTest = META test...
+metaWrongMessage = META test: Received wrong type of the message
+middlebox = Mellomboks
+middleboxFail = Tjenerfeil under mellombokstesting
+middleboxFail2 = Mellombokstest feilet!
+middleboxModifyingMss = Til orientering: En mellomboks i nettet forandrer valgt MSS
+middleboxTest = Tcpbw100 mellombokstest...
+moreDetails = Detaljer
+name = Navn
+ndtServerHas = NDT-tjeneren har en buffer p\u00e5
+noPktLoss1 = Intet pakketap
+noPktLoss2 = Intet pakketap
+numberOfTests = Antall tester
+of = av
+off = AV
+ok = OK
+oldDuplexMismatch = Advarsel: Gammel dupleksitetsfeil oppdaget:
+on = P\u00C5
+ooOrder = men pakker ankom i feil rekkef\u00f8lge
+options = Innstillinger
+osData = Operativsystem:
+otherClient = Tjeneren er for \u00f8yeblikket opptatt med en annen klient. Testen din vil begynne innen
+otherTraffic = Informasjon: Annen trafikk overbelaster linken
+outboundTest = Tcpbw100 utg\u00e5ende test...
+outboundWrongMessage = K-T ytelsestest: mottok feil type melding
+packetQueuing = Pakkek\u00f8ing
+packetQueuingInfo = TCP (Transmission Control Protocol) er en p\u00e5litelig nettverksprotokoll\n som overf\u00f8rer data mellom forskjellige maskiner. Den oppdager og motvirker\n automatisk feil og pakketap. TCP bruker buffere for \u00e5 oppn\u00e5 dette.\n I tillegg s\u00e5 har svitsjer og rutere buffere for \u00e5 h\u00e5ndtere tilfeller\n hvor mange maskiner sender til samme port, eller hvor hastigheter\n endres (for eksempel "Fast Ethernet" eller et DSL-modem).\n \n NDT-tjeneren genererer og sender 10 sekunder med data til klienten.\n I noen tilfeller genererer tjeneren data kjappere enn den klarer \u00e5\n sende ut pakker til nettverket (for eksempel en tjener med 2GHz CPU\n som sender til en klient koblet til via DSL). N\u00e5r dette skjer, hender\n det at det er igjen pakker i pakkek\u00f8en n\u00e5r de 10 sekundene har passert.\n TCP vil automatisk fors\u00f8ke \u00e5 sende disse pakkene, selv om tiden er ute,\n og klienten vil fortsette \u00e5 motta de. Dette vil f\u00f8re til at klienttesten\n kan kj\u00f8re litt lenger enn forventet.\n \n Dette hendte under kj\u00f8ringen av denne testen. Du trenger ikke gj\u00f8re noe\n for \u00e5 fikse dette.
+packetSizePreserved = Pakkest\u00f8rrelse blir bevart fra ende til ende
+packetsize = pakkkest\u00f8rrelse
+pc = Personlig datamaskin
+pctOfTime = % av tiden
+performedTests = Tester \u00e5 utf\u00f8re
+pktsRetrans = pakker ble retransmittert
+possibleDuplexFullHalf = Alarm: Mulig dupleksitetsfeil oppdaget; svitsj=full og maskin=halv
+possibleDuplexHalfFull = Alarm: Mulig dupleksitetsfeil oppdaget; svitsj=halv og maskin=full
+possibleDuplexHalfFullWarning = Advarsel: Mulig dupleksitetsfeil oppdaget; svitsj=halv og maskin=full
+preferIPv6 = bruk IPv6 hvis mulig
+printDetailedStats = Viser detaljer
+protocolError = Protokollfeil! Mottok: 0x
+qSeen = ytelsestest: Pakkek\u00f8ing oppdaget
+ready = Tcpbw100 klar
+receiveBufferShouldBe = Informasjon: Mottaksbufferen burde v\u00e6re
+receiving = Henter resultater...
+reportProblem = Meld fra om problemer
+resultsParseError = Feil under tolkingen av testresultater!
+resultsTimeout = Advarsel! Tidsavbrudd under henting av data, mulig dupleksitetsfeil
+resultsWrongMessage = Testresultater: Mottok feil type melding
+rtt = rundreisetid
+rttFail = For lang rundreisetid til \u00e5 bestemme type link.
+runningInboundTest = Kj\u00f8rer 10 sekunders innkommende test (tjener-til-klient [T-K]) . . . .
+runningOutboundTest = Kj\u00f8rer 10 sekunders utg\u00e5ende test (klient-til-tjener [K-T]) . . . . . . .
+s2c = T-K
+s2cPacketQueuingDetected = [T-K]: Pakkek\u00f8ing oppdaget
+s2cThroughput = Ytelse tjener-klient
+s2cThroughputFailed = Ytelsestest fra tjener til klient FEILET!
+sackReceived = SACK-blokker ble mottatt.
+scalingFactors = Skaleringsfaktorer
+seconds = sekunder
+sendingMetaInformation = Sending META information . . . . . . . . . . . . . . . . . . .
+server = Tjener
+serverAcksReport = basert p\u00e5 ack fra tjeneren ansl\u00e5s linken til
+serverFault = Tjener Forkastningen; Ukjente forkastningen oppstod. Du kan pr\u00f8ve senere
+serverBusy = Tjener opptatt; For mange klienter i k\u00f8. Du kan pr\u00f8ve senere
+serverBusy15s = Tjener opptatt; vennligst vent 15 sekunder mens forrige test kj\u00f8res ferdig
+serverBusy30s = Tjener opptatt; vennligst vent 30 sekunder mens forrige test kj\u00f8res ferdig
+serverBusy60s = Tjener opptatt; vennligst vent 60 sekunder mens forrige test kj\u00f8res ferdig
+serverDataReports = Basert p\u00e5 data fra tjeneren ansl\u00e5s linken til
+serverFail = Tjenerfeil under mottak av data
+serverIpModified = Til orientering: Network Address Translation (NAT) forandrer klientmaskinens IP-adresse
+serverIpPreserved = Tjenermaskinens IP-adresse blir bevart fra ende til ende
+serverNotRunning = Tjenerprosess kj\u00f8rer ikke; vennligst start "web100srv" p\u00e5 tjeneren.
+serverSays = Tjeneren sier
+sfwFail = Enkel brannmurtest FEILET!
+sfwSocketFail = Enkel brannmurtest: Kan ikke opprette lytteport
+sfwTest = Enkel brannmurtest...
+sfwWrongMessage = Enkel brannmurtest: Mottok feil type melding
+showOptions = Vis innstillinger
+simpleFirewall = Enkel brannmur
+sleep10m = Venter 10 minutter...
+sleep12h = Venter 12 timer...
+sleep1d = Venter ett d\u00f8gn...
+sleep1m = Venter ett minutt...
+sleep2h = Venter to timer...
+sleep30m = Venter 30 minutter...
+sleep5m = Venter fem minutter...
+start = START
+startingTest = Starter test
+statistics = Statistikk
+stop = STOPP
+stopped = Testene ble stoppet!
+stopping = Stopper...
+systemFault = systemfeil
+test = Test
+testsuiteWrongMessage = Avtaler tester: Mottok feil type melding
+theSlowestLink = Den tregeste linken i stien mellom din maskin og tjeneren er et
+theoreticalLimit = Teoretisk grense for nettet er
+thisConnIs = Denne forbindelsen er
+timesPktLoss = ganger p\u00e5 grunn av pakketap
+toMaximizeThroughput = kilobyte for \u00e5 maksimere ytelsen
+toRunTest = for \u00e5 teste
+troubleReportFrom = Feilrapport fra NDT p\u00e5
+unableToDetectBottleneck = Tjeneren greide ikke \u00e5 bestemme flaskehalsen i stien
+unableToObtainIP = Kunne ikke f\u00e5 tak i den lokale IP-addressen
+unknownID = Ukjent test-ID
+unknownServer = Ukjent tjener
+unsupportedClient = Informasjon: Tjeneren st\u00f8tter ikke denne kommandolinjeklienten
+usingIpv4 = -- Bruker IPv4-addresse
+usingIpv6 = -- Bruker IPv6-addresse
+vendor = Leverand\u00f8r
+version = Versjon
+versionWrongMessage = Avtaler NDT-versjon: Mottok feil type melding
+web100Details = Detaljerte opplysninger fra Web100
+web100KernelVar = Kjernevariabler fra WEB100
+web100Stats = Statistikk fra WEB100
+web100Var = Variabler fra Web100
+web100rtt = Web100 melder at rundreisetid
+web100tcpOpts = Web100 melder at valgbare felt i TCP som p\u00e5virker ytelse er satt til:
+willImprove = vil forbedre ytelsen
+workstation = Arbeidsstasjon
+your = Din
+yourPcHas = Datamaskinen din har en buffer p\u00e5
+t1Str = T1
+t3Str = T3;
+ethernetStr = Ethernet
+fastEthernet = FastE
+oc12Str = OC-12
+gigabitEthernetStr = GigE
+oc48Str = OC-48
+tengigabitEthernetStr = 10 Gig
+systemFaultStr = systemFault
+dialupStr = dialup2
+rttStr = rtt
=======================================
--- /dev/null
+++ /trunk/flash-client/src/locale/nl_NL/DisplayMessages.properties Sun Feb 2 19:14:17 2014 UTC
@@ -0,0 +1,235 @@
+10gbps = 10 Gbps 10 Gigabit Ethernet/OC-192 subnet
+10mbps = 10 Mbps Ethernet subnet
+10mins = 10 minutes
+12hours = 12 uren
+1day = 1 dag
+1gbps = 1.0 Gbps Gigabit Ethernet subnet
+1min = 1 minuut
+2.4gbps = 2.4 Gbps OC-48 subnet
+2hours = 2 uren
+30mins = 30 minuten
+45mbps = 45 Mbps T3/DS3 subnet
+5mins = 5 minuten
+622mbps = a 622 Mbps OC-12 subnet
+and = en
+architecture = Architectuur
+bytes = Bytes
+c2s = C2S
+c2sPacketQueuingDetected = [C2S]: Packet queueing detected
+c2sThroughput = C2S doorvoer
+c2sThroughputFailed = C2S doorvoer test MISLUKT!
+cabledsl = Kabel/DSL modem
+cablesNok = Melding: erg veel netwerk errors, controleer de netwerk kabels
+cablesOk = Goede netwerk kabel(s) gevonden
+checkingFirewalls = Zoeken naar firewalls . . . . . . . . . . . . . . . . . . .
+checkingMiddleboxes = Zoeken naar tussenliggende routers . . . . . . . . . . . . . . . . . .
+clickStart = Klik START om de test te beginnen
+clickStart2 = Klik START om opnieuw te testen
+client = Client
+client2 = Client
+clientAcksReport = Client Acks zegt dat link is
+clientDataReports = Client Data zegt dat link is
+clientInfo = Client Systeem Details
+clientIpModified = Informatie: Network Address Translation (NAT) Uw router verandert het IP adres
+clientIpNotFound = Client IP adres niet gevonden. Voor IE gebruikers, verander de Java parameters\n Klik Tools - Internet Options - Security - Custom Level, scroll naar\n Microsoft VM - Java permissions en klik Custom, click Java Custom Settings\n Edit Permissions - Access to all Network Addresses, klik Enable en sla uw wijzigingen op
+clientIpPreserved = Server IP adressen zijn beveiligd End-to-End
+clientSays = maar Client zegt
+close = Sluiten
+comments = Commentaar
+congestNo = Geen netwerk overgebruik ontdekt.
+congestYes = Informatie: doorvoer is gelimiteerd door ander netwerk verkeer.
+connIdle = De connectie was idle
+connStalled = De connectie is vastgelopen
+connected = Verbonden met:
+connectedTo = is verbonden met een
+copy = Kopie
+defaultTests = Standaard tests
+delayBetweenTests = vertraging tussen tests
+detailedStats = Gedetailleerde Statistieken
+dialup = Inbel Modem
+dialup2 = Inbel
+done = Klaar.
+done2 = Tcpbw100 klaar
+dupAcksIn = meerdere dezelfde acks ontvangen
+duplexFullHalf = Alarm: Duplex Mismatch conditie gedetecteerd Switch=full en Host=half
+duplexHalfFull = Alarm: Duplex Mismatch conditie gedetecteerd Switch=half en Host=full
+duplexNok = Melding: Oude Duplex mismatch conditie gedetecteerd:
+duplexOk = Normale duplex instellingen gevonden.
+endOfEmail = Einde Van Email Bericht
+excLoss = Excessieve verloren pakketten zorgen voor een slechtere doorvoer, controleer de auto-negotiate functie op uw PC en de netwerk switch
+excessiveErrors = Alarm: Excessieve errors, controleer netwerk kabel(s).
+firewallNo = is niet achter een firewall. [Connectie naar de directe poort was succesvol]
+firewallYes = is waarschijnlijk achter een firewall. [Connectie naar de directe poort mislukt]
+flowControlLimits = Het network based flow control limiteerd de doorvoer tot
+found100mbps = 100 Mbps FastEthernet link gevonden.
+found10gbps = 10 Gbps 10 GigEthernet/OC-192 link gevonden.
+found10mbps = 10 Mbps Ethernet link gevonden.
+found1gbps = 1 Gbps GigabitEthernet link gevonden.
+found2.4gbps = 2.4 Gbps OC-48 link gevonden.
+found45mbps = 45 Mbps T3/DS3 link gevonden.
+found622mbps = 622 Mbps OC-12 link gevonden.
+foundDialup = Inbel modem link gevonden.
+foundDsl = Kabel modem/DSL/T1 link gevonden.
+fullDuplex = Full duplex Fast Ethernet subnet
+general = normaal
+generatingReport = Probleem Rapport Genereren: Dit rapport wordt gemaild naar de persoon die u opgeeft
+getWeb100Var = Vraag WEB100 Variabelen op
+halfDuplex = Half duplex Fast Ethernet subnet
+id = TCP/Web100 Network Diagnostic Tool
+immediate = direct
+inboundTest = Tcpbw100 inkomende test...
+inboundWrongMessage = C2S doorvoer test: Verkeerd type bericht ontvangen
+incompatibleVersion = Incompatibel versie nummer
+incrRxBuf = Verhogen van de client´s recieve buffer
+incrTxBuf = Verhogen van de server´s send buffer
+information = Informatie
+initialization = Initialisatie...
+insufficient = Niet genoeg data verzameld om link type te bepalen.
+invokingMailtoFunction = Tcpbw100 Mailto functie uitvoeren
+ipProtocol = IP protocol
+ipcFail = Inter-proces communicatie mislukt, onbekend link type.
+usingIpv4 = -- Maakt gebruik van IPv4 adres
+usingIpv6 = -- Maakt gebruik van IPv6 adres
+javaData = Java data
+kbyteBufferLimits = KByte buffer, dit limiteerd de doorvoer tot
+limitNet = netwerk gelimiteerd
+limitRx = ontvanger gelimiteerd
+limitTx = zender gelimiteerd
+linkFullDpx = Link aangepast naar Full Duplex mode
+linkHalfDpx = Link aangepast naar Half Duplex mode
+loggingWrongMessage = Loggen naar server: Verkeerd type bericht ontvangen
+lookupError = Kan geen remote IP adres verkrijgen
+mboxWrongMessage = Middlebox test: Verkeerd type bericht ontvangen
+meta = META
+metaFailed = META test FAILED!
+metaTest = META test...
+metaWrongMessage = META test: Received wrong type of the message
+middlebox = Middlebox
+middleboxFail = Server heeft gefaald while middlebox testing
+middleboxFail2 = Middlebox test MISLUKT!
+middleboxModifyingMss = Informatie: Netwerk Middlebox verandert MSS variabele
+middleboxTest = Tcpbw100 Middlebox test...
+moreDetails = Meer Details...
+name = Naam
+ndtServerHas = De NDT server heeft een
+noPktLoss1 = Geen verloren packets
+noPktLoss2 = Er zijn geen verloren packets geconstateerd
+numberOfTests = Aantal tests
+of = van
+off = OFF
+ok = OK
+oldDuplexMismatch = "Melding: Oude Duplex mismatch conditie gedetecteerd: "
+on = ON
+ooOrder = maar packets kwamen in de verkeerde volgorde aan
+options = Opties
+osData = OS data:
+otherClient = Op dit moment wordt een andere client geholpen, uw test begint zo spoedig mogelijk
+otherTraffic = Informatie: Ander netwerk verkeer vertraagd de connectie
+outboundTest = Tcpbw100 uitgaande test...
+outboundWrongMessage = C2S doorvoer test: Verkeerd type bericht ontvangen
+packetQueuing = Pakket queuing
+packetQueuingInfo = TCP (Transmission Control Protocol) verstuurd betrouwbaar tussen twee\n Internet hosts. Het detecteerd en hersteld error en verliezen.\n TCP gebruikt buffers om deze betrouwbaarheid te verzorgen. Daarnaast,\n hebben switches en routers ook buffers om situaties waarbij meerdere\n links pakketten versturen naar een enkele uitgaande poort of wanneer\n de link snelheid veranderd (FastEthernet naar DSL modem).\n\n De NDT server genereerd en verstuurd 10 seconden data naar de client. In\n sommige gevallen genereerd de server sneller pakketten dan er verstuurd\n kan worden naar het netwerk (bijv., een 2 GHz CPU naar een DSL link).\n Wanneer dit gebeurt, blijven sommige pakketten hangen in de server queue\n wanneer de 10 seconden timeout optreedt. TCP zal automatisch doorgaan\n met het verzenden van deze pakketten en de client zal deze ook blijven accepteren\n en behandelen. Dit kan ervoor zorgen dat de client test langer duurt dan gepland.\n\n Deze situatie heeft zich voorgedaan tijdens deze test. U hoeft geen actie te\n ondernemen om dit probleem op te lossen.\n
+packetSizePreserved = Pakket grootte is bewaard gebleven End-to-End
+packetsize = de Pakket grootte
+pc = PC
+pctOfTime = % van de tijd
+performedTests = Uitgevoerde tests
+pktsRetrans = pakketten opnieuw verstuurd
+possibleDuplexFullHalf = Alarm: Mogelijke Duplex Mismatch conditie gedetecteerd Switch=Full en Host=half
+possibleDuplexHalfFull = Alarm: Mogelijke Duplex Mismatch conditie gedetecteerd Switch=half en Host=full
+possibleDuplexHalfFullWarning = Warning: Alarm: Mogelijke Duplex Mismatch conditie gedetecteerd Switch=half en Host=full
+preferIPv6 = prefereer IPv6
+printDetailedStats = Print Gedetaileerde Statistieken
+protocolError = Protocol error! Verwachtte 'prepare', maar kreeg: 0x
+qSeen = doorvoer test: Pakket queuing gedetecteerd
+ready = Tcpbw100 klaar voor gebruik
+receiveBufferShouldBe = Informatie: The ontvangst buffer zou moeten zijn
+receiving = Resultaten ontvangen...
+reportProblem = Rapporteer een probleem
+resultsParseError = Error bij het parsen van de test resultaten!
+resultsTimeout = Melding! Client time-out tijden het lezen van de data, mogelijk duplex mismatch is aanwezig
+resultsWrongMessage = Test resultaten: Verkeerd type bricht ontvangen
+rtt = RTT
+rttFail = Link detectie algorithme mislukt vanwege excessieve Round Trip Times.
+runningInboundTest = uitvoeren 10s inkomende test (server-naar-client [S2C]) . . . . . .
+runningOutboundTest = uitvoeren 10s uitgaande test (client-naar-server [C2S]) . . . . .
+s2c = S2C
+s2cPacketQueuingDetected = [S2C]: Pakket queueing gedetecteerd
+s2cThroughput = S2C doorvoer
+s2cThroughputFailed = S2C tdoorvoer test MISLUKT!
+sackReceived = SACK blocks ontvangen
+scalingFactors = Scaling Factoren
+seconds = seconden
+sendingMetaInformation = Sending META information . . . . . . . . . . . . . . . . . . .
+server = Server
+serverAcksReport = Server Acks zegt dat link is
+serverFault = De Fout van de server: de onbekende fout kwam voor. Gelieve te proberen opnieuw later
+serverBusy = Server Bezig: Teveel clients wachtende in queue. Probeer het later nog eens
+serverBusy15s = Server Bezig: Wacht alstublieft 15 seconden om de vorige test af te ronden
+serverBusy30s = Server Bezig: Wacht alstublieft 30 seconden om de vorige test af te ronden
+serverBusy60s = Server Bezig: Wacht alstublieft 60 seconden om de vorige test af te ronden
+serverDataReports = Server Data zegt dat link is
+serverFail = Server fout tijdens het ontvangen van data
+serverIpModified = Informatie: Network Address Translation (NAT) box verandert het IP adres van de client
+serverIpPreserved = Server IP adressen worden behouden End-to-End
+serverNotRunning = Server proces draait niet: start het web100srv proces op de server
+serverSays = Server zegt
+sfwFail = Simpele firewall test MISLUKT!
+sfwSocketFail = Simpele firewall test: Kan geen listen socket aanmaken
+sfwTest = Simpele firewall test...
+sfwWrongMessage = Simpele firewall test: Verkeerd bericht ontvangen
+showOptions = Toon opties
+simpleFirewall = Simpele firewall
+sleep10m = Slapen voor 10 minuten...
+sleep1m = Slapen voor 1 minuut...
+sleep30m = Slapen voor 30 minuten...
+sleep5m = Slapen voor 5 minuten...
+sleep12h = Slapen voor 12 uren...
+sleep1d = Slapen voor 1 dag...
+sleep2h = Slapen voor 2 uren...
+start = START
+startingTest = Starten test
+statistics = Statistieken
+stop = STOP
+stopped = De tests zijn gestopt!
+stopping = Stoppen...
+systemFault = Systeem Fout
+test = Test
+testsuiteWrongMessage = Overleggen test suite: Verkeerd type bericht ontvangen
+theSlowestLink = De traagste link in het end-to-end pad is een
+theoreticalLimit = De theoretische netwerk limiet is
+thisConnIs = Deze connectie is
+timesPktLoss = keren vanwege packet loss
+toMaximizeThroughput = kbytes om doorvoer te maximaliseren
+troubleReportFrom = Probleem Rapport van NDT op
+unableToDetectBottleneck = Server kan de bottleneck link niet bepalen.
+unableToObtainIP = Kan lokaal IP adres niet achterhalen
+unknownID = Onbekend test ID
+unknownServer = Onbekende server
+unsupportedClient = Informatie: De server ondersteund deze command line client niet
+vendor = Bedrijf
+version = Versie
+versionWrongMessage = Overleggen NDT versie: Verkeerd type bericht ontvangen
+web100Details = Web100 gedetaileerde Analyze
+web100KernelVar = WEB100 Kernel Variabelen
+web100Stats = WEB100 Enabled Statistieken
+web100Var = Web100 Variabelen
+web100rtt = Web100 rapporteerd de Round trip time
+web100tcpOpts = Web100 heeft voor TCP de volgende optionele settings overlegd:
+willImprove = zal de performance verbeteren
+workstation = Werkstation
+your = Uw
+yourPcHas = Uw PC/Werkstation heeft een
+connectingTo = Connecten naar
+toRunTest = start test
+t1Str = T1
+t3Str = T3;
+ethernetStr = Ethernet
+fastEthernet = FastE
+oc12Str = OC-12
+gigabitEthernetStr = GigE
+oc48Str = OC-48
+tengigabitEthernetStr = 10 Gig
+systemFaultStr = systemFault
+dialupStr = dialup2
+rttStr = rtt
=======================================
--- /dev/null
+++ /trunk/flash-client/src/locale/pt_BR/DisplayMessages.properties Sun Feb 2 19:14:17 2014 UTC
@@ -0,0 +1,234 @@
+10gbps = sub-rede Gigabit Ethernet/OC-192 de 10 Gbps (10 Gbps 10 Gigabit Ethernet/OC-192 subnet)
+10mbps = sub-rede Ethernet de 10 Mbps (10 Mbps Ethernet subnet)
+10mins = 10 min
+12hours = 12 horas
+1day = 1 dia
+1gbps = sub-rede Gigabit Ethernet de 1.0 Gbps (1.0 Gbps Gigabit Ethernet subnet)
+1min = 1 min
+2.4gbps = sub-rede OC-48 de 2.4 Gbps ( 2.4 GbpsOC-48 subnet)
+2hours = 2 horas
+30mins = 30 min
+45mbps = sub-rede T3/DS3 de 45 Mbps (45 Mbps T3/DS3 subnet)
+5mins = 5 min
+622mbps = uma sub-rede OC-12 de 622 Mbps ( a 622 Mbps OC-12 subnet)
+and = e
+architecture = Arquitetura
+bytes = Bytes
+c2s = C2S
+c2sPacketQueuingDetected = [C2S]: Fila de pacotes detectada
+c2sThroughput = C2S taxa de transfer\u00EAncia
+c2sThroughputFailed = C2S teste de taxa de transfer\u00EAncia FALHOU!
+cabledsl = Cabo/ modem DSL
+cablesNok = Aviso: excessivos erros de rede detectados, verifique o(s) cabo(s) de rede
+cablesOk = Encontrado(s) cabo(s) de rede adequados
+checkingFirewalls = Procurando por firewalls . . . . . . . . . . . . . . . . . . .
+checkingMiddleboxes = Procurando por Middleboxes . . . . . . . . . . . . . . . . . .
+clickStart = Clique em INICIAR para iniciar o teste
+clickStart2 = Clique em INICIAR para executar o teste novamente
+client = Cliente
+client2 = Cliente
+clientAcksReport = Cliente Acks reporta que o link \u00E9
+clientDataReports = Dados do Cliente reporta que o link \u00E9
+clientInfo = Detalhes do Sistema do Cliente
+clientIpModified = Informa\u00E7\u00E3o: Network Address Translation (NAT) box est\u00E1 modificando o endere\u00E7o IP do cliente
+clientIpNotFound = Endere\u00E7o IP do Cliente n\u00E3o encontrado. Para usu\u00E1rios do IE, altere os par\u00E2metros do Java\n clique em Ferramentas - Op\u00E7\u00F5es da Internet - Seguran\u00E7a - N\u00EDvel personalizado, role para baixo at\u00E9 Microsoft VM - Permiss\u00F5es Java e clique em Customizar, clique Customizar configura\u00E7\u00F5es do Java\n Edite as Permiss\u00F5es - Acesse todos Endere\u00E7os de Rede, clique em habilitar e salve as altera\u00E7\u00F5es
+clientIpPreserved = Endere\u00E7os IP do Servidor s\u00E3o preservados fim a fim
+clientSays = mas o Cliente diz
+close = Fechar
+comments = Comment\u00E1rios
+congestNo = Congestionamento da rede n\u00E3o foi detectado
+congestYes = Informa\u00E7\u00E3o: taxa de transfer\u00EAncia \u00E9 limitada devido a outro tr\u00E1fego de rede.
+connIdle = A conex\u00E3o estava ociosa em
+connStalled = A conex\u00E3o foi interrompida
+connected = Conectado a:
+connectedTo = est\u00E1 conectado a um(a)
+copy = Copiar
+defaultTests = Testes padr\u00E3o
+delayBetweenTests = Atraso entre os testes
+detailedStats = Estat\u00EDsticas detalhadas
+dialup = Modem Dial-up
+dialup2 = Discada
+done = Conclu\u00EDdo
+done2 = Tcpbw100 conclu\u00EDdo.
+dupAcksIn = acks duplicados recebidos
+duplexFullHalf = Alerta: Dupla condi\u00E7\u00E3o de incompatibilidade detectada Switch=Full e Host=half
+duplexHalfFull = Alerta: Dupla condi\u00E7\u00E3o de incompatibilidade detectada Switch=half e Host=full
+duplexNok = Aviso: Antiga dupla condi\u00E7\u00E3o de incompatibilidade detectada:
+duplexOk = Dupla opera\u00E7\u00E3o normal encontrada.
+endOfEmail = Final da mensagem de E-mail
+excLoss = Excessiva perda de pacotes est\u00E1 impactando na sua performance, cheque a fun\u00E7\u00E3o auto-negotiate no seu computador local e no switch da rede
+excessiveErrors = Alerta: Erros excessivos, verifique o(s) cabo(s) de rede.
+firewallNo = n\u00E3o protegido por firewall. [Conex\u00E3o com a porta ef\u00EAmera conclu\u00EDda com \u00EAxito]
+firewallYes = provavelmente protegido por firewall. [Conex\u00E3o com a porta ef\u00EAmera falhou]
+flowControlLimits = O controle de fluxo da rede limita a taxa de transfer\u00EAncia em
+found100mbps = link de 100 Mbps FastEthernet encontrado.
+found10gbps = link de 10 Gbps 10 GigEthernet/OC-192 encontrado.
+found10mbps = link de 10 Mbps Ethernet encontrado.
+found1gbps = link de 1 Gbps GigabitEthernet encontrado.
+found2.4gbps = link de 2.4 Gbps OC-48 encontrado.
+found45mbps = link de 45 Mbps T3/DS3 encontrado.
+found622mbps = link de 622 Mbps OC-12 encontrado.
+foundDialup = link de Dial-up modem encontrado.
+foundDsl = link de modem a cabo/DSL/T1 encontrado.
+fullDuplex = sub-rede Full duplex Fast Ethernet
+general = Geral
+generatingReport = Gerando Relat\u00F3rio de Problemas: Esse relat\u00F3rio ser\u00E1 enviado por email para a pessoa que voc\u00EA especificar
+getWeb100Var = Buscar vari\u00E1veis web100
+halfDuplex = sub-rede Half duplex Fast Ethernet
+id = TCP/Web100 Ferramenta de Diagn\u00F3stico da Rede
+immediate = imediato
+inboundTest = Tcpbw100 teste de entrada inbound test...
+inboundWrongMessage = C2S teste de taxa de transfer\u00EAncia: Tipo errado de mensagem foi recebido
+incompatibleVersion = N\u00FAmero da vers\u00E3o incompat\u00EDvel
+incrRxBuf = Aumentando o buffer de recep\u00E7\u00E3o do cliente
+incrTxBuf = Aumentando o buffer de envio do servidor NDT
+information = Informa\u00E7\u00E3o
+initialization = Inicializa\u00E7\u00E3o...
+insufficient = Dados coletados s\u00E3o insuficientes para determinar tipo de link.
+invokingMailtoFunction = Tcpbw100 Chamando fun\u00E7\u00E3o Mailto
+ipProtocol = Protocolo IP
+ipcFail = Comunica\u00E7\u00F5es entre processos falhou, tipo de link desconhecido.
+usingIpv4 = -- Usando endere\u00E7o IPv4
+usingIpv6 = -- Usando endere\u00E7o IPv6
+javaData = Dados Java
+kbyteBufferLimits = KByte buffer que limita a taxa de transfer\u00EAncia para
+limitNet = limitada pela rede em
+limitRx = destinat\u00E1rio limitado
+limitTx = remetende limitado
+linkFullDpx = Link definido/configurado para modo Full Duplex
+linkHalfDpx = Link definido/configurado para modo Half Duplex
+loggingWrongMessage = Logando ao servidor: Tipo errado de mensagem foi recebido
+lookupError = N\u00E3o foi poss\u00EDvel obter o endere\u00E7o IP remoto
+mboxWrongMessage = Teste Middlebox : Tipo errado de mensagem foi recebido
+meta = META
+metaFailed = META test FAILED!
+metaTest = META test...
+metaWrongMessage = META test: Received wrong type of the message
+middlebox = Middlebox
+middleboxFail = Servidor falhou durante o teste de middlebox
+middleboxFail2 = Teste Middlebox FALHOU!
+middleboxModifyingMss = Informa\u00E7\u00E3o: Middlebox da Rede est\u00E1 modificando a vari\u00E1vel MSS
+middleboxTest = Tcpbw100 teste Middlebox ...
+moreDetails = Mais Detalhes...
+name = Nome
+ndtServerHas = O servidor NDT possui um
+noPktLoss1 = Perda de pacotes n\u00E3o
+noPktLoss2 = N\u00E3o foi observada perda de pacotes
+numberOfTests = N\u00FAmero de testes
+of = de
+off = DESLIGADO
+ok = OK
+oldDuplexMismatch = "Aviso: Antiga dupla condi\u00E7\u00E3o de incompatibilidade detectada:"
+on = LIGADO
+ooOrder = mas os pacotes fotam recebidos fora da ordem
+options = Op\u00E7\u00F5es
+osData = Dados do SO:
+otherClient = Outro cliente est\u00E1 sendo servido, seu teste ter\u00E1 in\u00EDcio em
+otherTraffic = Informa\u00E7\u00E3o: Tr\u00E1fego de outras redes est\u00E1 congestionando o link
+outboundTest = Tcpbw100 teste de sa\u00EDda...
+outboundWrongMessage = C2S teste de taxa de transfer\u00EAncia: Tipo errado de mensagem foi recebido
+packetQueuing = Filas de Pacotes
+packetQueuingInfo = TCP (Protocolo de Controle de Transmiss\u00E3o) transfere dados de forma confi\u00E1vel entre dois\n hosts. Ele automaticamente detecta e recupera de erros\ n e perdas. O TCP usa buffers para prover essa confiabilidade. Al\u00E9m disso, switches e roteadores usam buffers para lidar/gerenciar casos em que v\u00E1rios links enviam pacotes para uma \u00FAnica sa\u00EDda ou a velocuidade do link muda\n (Ethernet R\u00E1pida para modem DSL.\n\n O servidor NDT gera e envia 10 segundos de dados para o cliente. Em\n alguns casos o servidor pode gerar dados mais r\u00E1pido do que enviar pacotes para a rede (ex: um CPU de 2GHz enviando para um cliente conectado a um DSL).\n Quando isso ocorre, alguns pacotes podem ficar enfileiirados na sa\u00EDda do servidor\n quando \u00E9 expirado o tempo de 10 segundos. O TCP automaticamente continuar\u00E1 a enviar esses pacotes enfileirados e o cliente vai continuar aceitando e processando esses pacotes. Isso resulta em um maior tempo de execu\u00E7\u00E3o do teste do cliente. Essa situa\u00E7\u00E3o ocorreu durante esse teste. Nenhuma a\u00E7\u00E3o \u00E9 requerida para\n resolver esse problema.
+packetSizePreserved = O Tamanho do Pacote \u00E9 preservado Fim a Fim
+packetsize = o tamanho do Pacote
+pc = PC
+pctOfTime = % do tempo
+performedTests = Testes executados
+pktsRetrans = pacotes retransmitidos
+possibleDuplexFullHalf = Alarme: Poss\u00EDvel Dupla condi\u00E7\u00E3o de incompatibilidade detectada Switch=Full e Host=half
+possibleDuplexHalfFull = Alarme: Poss\u00EDvel Dupla condi\u00E7\u00E3o de incompatibilidade detectada Switch=half e Host=full
+possibleDuplexHalfFullWarning = Aviso: Poss\u00EDvel Dupla condi\u00E7\u00E3o de incompatibilidade detectada Switch=half e Host=full
+preferIPv6 = prefira IPv6
+printDetailedStats = Imprima as Estat\u00EDsticas Detalhadas
+protocolError = Erro de Protocolo! Esperado 'prepare', obtido: 0x
+qSeen = teste de taxa de transfer\u00EAncia: Enfileiramento de pacotes detectado
+ready = Tcpbw100 pronto
+receiveBufferShouldBe = Informa\u00E7\u00E3o: O buffer de recep\u00E7\u00E3o deve ser
+receiving = Recebendo resultados...
+reportProblem = Reportar problema
+resultsParseError = Erro ao analisar os resultados do teste!
+resultsTimeout = Aviso! Tempo do cliente expirou ao ler os dados, poss\u00EDvel exist\u00EAncia de uma dupla condi\u00E7\u00E3o de incompatibilidade
+resultsWrongMessage = Resultados dos Testes: Tipos errados de mensagem foram recebidos
+rtt = RTT
+rttFail = Algor\u00EDtmo de detec\u00E7\u00E3o do link falhou devido a excessivos
+runningInboundTest = executando teste de entrada de 10s (servidor para cliente [S2C]) . . . . . .
+runningOutboundTest = executando teste de sa\u00EDda de 10s (cliente para servidor [C2S]) . . . . .
+s2c = S2C
+s2cPacketQueuingDetected = [S2C]: Enfileiramento de pacotes detectados
+s2cThroughput = S2C taxa de transfer\u00EAncia
+s2cThroughputFailed = S2C teste de taxa de transfer\u00EAncia FALHOU!
+sackReceived = Blocos SACK recebidos
+scalingFactors = Fatores de Escala/escalonamento
+seconds = segundos
+sendingMetaInformation = Sending META information . . . . . . . . . . . . . . . . . . .
+server = Servidor
+serverAcksReport = Servidor Acks reporta que o link \u00E9
+serverBusy = Servidor Ocupado: Muitos clientes aguardando na fila do servidor. Por favor, tente novamente mais tarde.
+serverBusy15s = Servidor Ocupado: Por favor, aguarde 15 segundos para a finaliza\u00E7\u00E3o do teste anterior
+serverBusy30s = Servidor Ocupado: Por favor, aguarde 30 segundos para a finaliza\u00E7\u00E3o do teste anterior
+serverBusy60s = Servidor Ocupado: Por favor, aguarde 60 segundos para a finaliza\u00E7\u00E3o do teste anterior
+serverDataReports = Dados do servidor reporta que o link \u00E9
+serverFail = Servidor falhou enquanto recebia dados
+serverIpModified = Informa\u00E7\u00E3o: Network Address Translation (NAT) box est\u00E1 modificando o endere\u00E7o IP do cliente
+serverIpPreserved = Endere\u00E7os IP do Servidor s\u00E3o preservados fim a fim
+serverNotRunning = Processo do servidor n\u00E3o est\u00E1 executando : inicie o processo web100srv no servidor remoto
+serverSays = Servidor diz
+sfwFail = Teste simples de firewall FALHOU!
+sfwSocketFail = Teste simples de firewall: N\u00E3o pode ser criado socket para escuta
+sfwTest = Teste simples de firewall...
+sfwWrongMessage = Teste simples de firewall: Tipos errados de mensagem foram recebidos
+showOptions = Mostrar op\u00E7\u00F5es
+simpleFirewall = Firewall simples
+sleep10m = Dormindo por 10 min...
+sleep1m = Dormindo por 1 min...
+sleep30m = Dormindo por 30 min...
+sleep5m = Dormindo por 5 min...
+sleep12h = Dormindo por 12 horas...
+sleep1d = Dormindo por 1 dia...
+sleep2h = Dormindo por 2 horas...
+start = INICIAR
+startingTest = Iniciando Teste
+statistics = Estat\u00EDsticas
+stop = PARAR
+stopped = Os testes foram interrompidos!
+stopping = Parando...
+systemFault = Falha do Sistema
+test = Teste
+testsuiteWrongMessage = Negotiating test suite: Tipos errados de mensagem foram recebidos
+theSlowestLink = O link mais lento no caminho fim a fim \u00E9
+theoreticalLimit = O limite te\u00F3rico da rede \u00E9
+thisConnIs = A conex\u00E3o est\u00E1
+timesPktLoss = vezes devido a perda de pacotes
+toMaximizeThroughput = kbytes para maximizar a taxa de transfer\u00EAncia
+troubleReportFrom = Trouble Report from NDT on
+unableToDetectBottleneck = Servidor n\u00E3o conseguiu determinar o tipo de gargalo.
+unableToObtainIP = N\u00E3o foi poss\u00EDvel obter o endere\u00E7o IP local
+unknownID = ID de teste desconhecido
+unknownServer = Servidor desconhecido
+unsupportedClient = Informa\u00E7\u00E3o: Esse servidor n\u00E3o fornece suporte a essa linha de comando
+vendor = Fabricante
+version = Vers\u00E3o
+versionWrongMessage = Negociando vers\u00E3o do NDT : Tipo errado de mensagem foi recebido
+web100Details = An\u00E1lise detalhada WEB100
+web100KernelVar = Vari\u00E1veis do Kernel WEB100
+web100Stats = Estat\u00EDsticas WEB100 dispon\u00EDveis
+web100Var = Vari\u00E1veis Web100
+web100rtt = Web100 reporta o tempo de Ida e Volta
+web100tcpOpts = Web100 verifica que TCP negociou as configura\u00E7\u00F5es de performance opicionais para:
+willImprove = ir\u00E1 melhorar a performance
+workstation = Esta\u00E7\u00E3o de trabalho
+your = Sua
+yourPcHas = Seu PC/Esta\u00E7\u00E3o de Trabalho tem um
+connectingTo = Conectando a
+toRunTest = para executar o teste
+t1Str = T1
+t3Str = T3;
+ethernetStr = Ethernet
+fastEthernet = FastE
+oc12Str = OC-12
+gigabitEthernetStr = GigE
+oc48Str = OC-48
+tengigabitEthernetStr = 10 Gig
+systemFaultStr = systemFault
+dialupStr = dialup2
+rttStr = rtt
=======================================
--- /dev/null
+++ /trunk/flash-client/src/locale/ru_RU/DisplayMessages.properties Sun Feb 2 19:14:17 2014 UTC
@@ -0,0 +1,233 @@
+10gbps = 10 \u0413\u0431\u0438\u0442/\u0441\u0435\u043A 10 Gigabit Ethernet/OC-192 \u043F\u043E\u0434\u0441\u0435\u0442\u044C
+10mbps = 10 \u041C\u0431\u0438\u0442/\u0441\u0435\u043A Ethernet \u043F\u043E\u0434\u0441\u0435\u0442\u044C
+10mins = 10 \u043C\u0438\u043D\u0443\u0442
+12hours = 12 \u0447\u0430\u0441\u043E\u0432
+1day = 1 \u0434\u0435\u043D\u044C
+1gbps = 1 \u0413\u0431\u0438\u0442/\u0441 Gigabit Ethernet \u043F\u043E\u0434\u0441\u0435\u0442\u044C
+1min = 1 \u043C\u0438\u043D
+2.4gbps = 2,4 \u0413\u0431\u0438\u0442/\u0441 OC-48 \u043F\u043E\u0434\u0441\u0435\u0442\u044C
+2hours = 2 \u0447\u0430\u0441\u0430
+30mins = 30 \u043C\u0438\u043D\u0443\u0442
+45mbps = 45 \u041C\u0431\u0438\u0442/\u0441 T3/DS3 \u043F\u043E\u0434\u0441\u0435\u0442\u044C
+5mins = 5 \u043C\u0438\u043D\u0443\u0442
+622mbps = 622 \u041C\u0431\u0438\u0442/\u0441 OC-12 \u043F\u043E\u0434\u0441\u0435\u0442\u044C
+and = \u0438
+architecture = \u0410\u0440\u0445\u0438\u0442\u0435\u043A\u0442\u0443\u0440\u0430
+bytes = \u0431\u0430\u0439\u0442
+c2s = C2S
+c2sPacketQueuingDetected = [C2S]: \u041E\u0431\u043D\u0430\u0440\u0443\u0436\u0435\u043D\u043E \u043D\u0430\u043A\u043E\u043F\u043B\u0435\u043D\u0438\u0435 \u043F\u0430\u043A\u0435\u0442\u043E\u0432 \u0432 \u043E\u0447\u0435\u0440\u0435\u0434\u0438
+c2sThroughput = C2S \u043F\u0440\u043E\u043F\u0443\u0441\u043A\u043Da\u044F \u0441\u043F\u043E\u0441\u043E\u0431\u043D\u043E\u0441\u0442\u044C
+c2sThroughputFailed = C2S \u0442\u0435\u0441\u0442 \u043D\u0430 \u043F\u0440\u043E\u043F\u0443\u0441\u043A\u043D\u0443\u044E \u0441\u043F\u043E\u0441\u043E\u0431\u043D\u043E\u0441\u0442\u044C \u043D\u0435 \u0441\u0440\u0430\u0431\u043E\u0442\u0430\u043B !
+cabledsl = \u043A\u0430\u0431\u0435\u043B\u044C\u043D\u044B\u0439 \u043C\u043E\u0434\u0435\u043C
+cablesNok = \u041F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u0435: \u0447\u0440\u0435\u0437\u043C\u0435\u0440\u043D\u043E\u0435 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u043E\u0448\u0438\u0431\u043E\u043A \u0441\u0435\u0442\u0438, \u043F\u0440\u043E\u0432\u0435\u0440\u044C\u0442\u0435 \u0441\u0435\u0442\u0435\u0432\u043E\u0439 \u043A\u0430\u0431\u0435\u043B\u044C
+cablesOk = \u0421\u0435\u0442\u0435\u0432\u043E\u0439 \u043A\u0430\u0431\u0435\u043B\u044C \u0432 \u043F\u043E\u0440\u044F\u0434\u043A\u0435
+checkingFirewalls = \u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u0441\u0435\u0442\u0435\u0432\u044B\u0445 \u044D\u043A\u0440\u0430\u043D\u043E\u0432. . . . . . . . . . . . . . . . . . .
+checkingMiddleboxes = \u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u041F\u0440\u043E\u043C\u0435\u0436\u0443\u0442\u043E\u0447\u043D\u044B\u0445 \u0443\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432 \u0441\u0435\u0442\u0438. . . . . . . . . . . . . . . . . .
+clickStart = \u041D\u0430\u0436\u043C\u0438\u0442\u0435 \u0421\u0422\u0410\u0420\u0422, \u0447\u0442\u043E\u0431\u044B \u043D\u0430\u0447\u0430\u0442\u044C \u0442\u0435\u0441\u0442
+clickStart2 = \u041D\u0430\u0436\u043C\u0438\u0442\u0435 \u0421\u0422\u0410\u0420\u0422, \u0447\u0442\u043E\u0431\u044B \u043F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u044C \u0442\u0435\u0441\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435
+client = \u041A\u043B\u0438\u0435\u043D\u0442
+client2 = \u041A\u043B\u0438\u0435\u043D\u0442
+clientAcksReport = \u041A\u043B\u0438\u0435\u043D\u0442 \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u043B \u0441 Ack \u0447\u0442\u043E \u043B\u0438\u043D\u043A
+clientDataReports = \u0414\u0430\u043D\u043D\u044B\u0435 \u043A\u043B\u0438\u0435\u043D\u0442\u0430 \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u044E\u0442 \u0447\u0442\u043E
+clientInfo = \u0414\u0430\u043D\u043D\u044B\u0435 \u043E \u043A\u043B\u0438\u0435\u043D\u0442\u0435
+clientIpModified = \u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F: \u0443\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432\u043E \u043F\u0440\u0435\u043E\u0431\u0440\u0430\u0437\u043E\u0432\u0430\u043D\u0438\u044F \u0441\u0435\u0442\u0435\u0432\u044B\u0445 \u0430\u0434\u0440\u0435\u0441\u043E\u0432 (NAT) \u0438\u0437\u043C\u0435\u043D\u044F\u0435\u0442 IP-\u0430\u0434\u0440\u0435\u0441 \u043A\u043B\u0438\u0435\u043D\u0442\u0430
+clientIpNotFound = IP-\u0430\u0434\u0440\u0435\u0441 \u041A\u043B\u0438\u0435\u043D\u0442\u0430 \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D. \u0414\u043B\u044F IE \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u0439, \u043F\u043E\u043F\u0440\u043E\u0431\u0443\u0439\u0442\u0435 \u0438\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B Java \n \u0432\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u0432 \u043C\u0435\u043D\u044E Service \u2013 Network Options - Security - Level, \u043F\u0440\u043E\u043B\u0438\u0441\u0442\u043D\u0438\u0442\u0435 \u0432\u043D\u0438\u0437 \u0434\u043E \n Microsoft VM - Java Permissions \u0438 \u043D\u0430\u0436\u043C\u0438\u0442\u0435 \u043A\u043D\u043E\u043F\u043A\u0443 Custom, \u0449\u0435\u043B\u043A\u043D\u0438\u0442\u0435 na Java Custom Settings \n Edit Persmissions - \u0434\u043E\u0441\u0442\u0443\u043F \u043A\u043E \u0432\u0441\u0435\u043C \u0441\u0435\u0442\u0435\u0432\u044B\u043C \u0430\u0434\u0440\u0435\u0441\u0430\u043C, \u043D\u0430\u0436\u043C\u0438\u0442\u0435 \u043A\u043D\u043E\u043F\u043A\u0443 En\u0430ble \u0438 \u0441\u043E\u0445\u0440\u0430\u043D\u0438\u0442e \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F
+clientIpPreserved = IP \u0430\u0434\u0440\u0435\u0441\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0431\u044B\u043B\u0438 \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u044B \u0431\u0435\u0437 \u0438\u0437\u043C\u0435\u043D\u0430\u043D\u0438\u044F \u043D\u0430 \u0432\u0441\u0435\u043C \u043F\u0443\u0442\u0438
+clientSays =, \u043D\u043E \u043A\u043B\u0438\u0435\u043D\u0442 \u0441\u043E\u043E\u0431\u0449\u0430\u0435\u0442
+close = \u0417\u0430\u043A\u0440\u044B\u0442\u044C
+comments = \u041A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0438
+congestNo = \u041F\u0435\u0440\u0435\u0433\u0440\u0443\u0436\u0435\u043D\u043D\u043E\u0441\u0442\u044C \u0441\u0435\u0442\u0438 \u043D\u0435 \u043E\u0431\u043D\u0430\u0440\u0443\u0436\u0435\u043D\u0430.
+congestYes = \u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F: \u043F\u0440\u043E\u043F\u0443\u0441\u043A\u043D\u0430\u044F \u0441\u043F\u043E\u0441\u043E\u0431\u043D\u043E\u0441\u0442\u044C \u043E\u0433\u0440\u0430\u043D\u0438\u0447\u0435\u043D\u0430 \u043F\u043E\u0441\u0442\u043E\u0440\u043E\u043D\u043D\u0438\u043C \u0441\u0435\u0442\u0435\u0432\u044B\u043C \u0442\u0440\u0430\u0444\u0438\u043A\u043E\u043C.
+connIdle = \u0421\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0435 \u043F\u0440\u043E\u0445\u043B\u0430\u0436\u0434\u0430\u043B\u043E\u0441\u044C \u0431\u0435\u0437 \u0442\u0440\u0430\u0444\u0438\u043A\u0430
+connStalled = \u0421\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0435 \u0437\u0430\u0441\u0442\u0440\u044F\u043B\u043E
+connected = \u041F\u043E\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u043E \u043A:
+connectedTo = \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0435\u043D \u043A
+copy = \u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C
+defaultTests = \u0422\u0435\u0441\u0442\u044B \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043D\u044B\u0435 \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E
+delayBetweenTests = \u0417\u0430\u0434\u0435\u0440\u0436\u043A\u0430 \u043C\u0435\u0436\u0434\u0443 \u0442\u0435\u0441\u0442\u0430\u043C\u0438
+detailedStats = \u041F\u043E\u0434\u0440\u043E\u0431\u043D\u0430\u044F \u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043A\u0430
+dialup = \u043C\u043E\u0434\u0435\u043C
+dialup2 = \u043C\u043E\u0434\u0435\u043C
+done = \u0413\u043E\u0442\u043E\u0432\u043E
+done2 = Tcpbw100 \u0433\u043E\u0442\u043E\u0432\u043E
+dupAcksIn = \u043F\u043E\u043B\u0443\u0447\u0435\u043D\u044B \u0434\u0443\u0431\u043B\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0435 acks
+duplexFullHalf = \u0412\u043D\u0438\u043C\u0430\u043D\u0438\u0435: \u041E\u0431\u043D\u0430\u0440\u0443\u0436\u0435\u043D\u043E \u041D\u0435\u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0435 \u0434\u0443\u043F\u043B\u0435\u043A\u0441\u0430 Switch=\u0434\u0443\u043F\u043B\u0435\u043A\u0441 \u0438 Host=\u043F\u043E\u043B\u0443\u0434\u0443\u043F\u043B\u0435\u043A\u0441
+duplexHalfFull = \u0412\u043D\u0438\u043C\u0430\u043D\u0438\u0435: \u041E\u0431\u043D\u0430\u0440\u0443\u0436\u0435\u043D\u043E \u041D\u0435\u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0435 \u0434\u0443\u043F\u043B\u0435\u043A\u0441\u0430 Switch=\u043F\u043E\u043B\u0443\u0434\u0443\u043F\u043B\u0435\u043A\u0441 \u0438 Host=\u0434\u0443\u043F\u043B\u0435\u043A\u0441
+duplexNok = \u041F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u0435: \u0440\u0430\u043D\u0435\u0435 \u043E\u0431\u043D\u0430\u0440\u0443\u0436\u0435\u043D\u043D\u043E\u0435 \u041D\u0435\u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0435 \u0434\u0443\u043F\u043B\u0435\u043A\u0441\u0430 \u043E\u0431\u043D\u0430\u0440\u0443\u0436\u0435\u043D\u043E:
+duplexOk = \u041D\u043E\u0440\u043C\u0430\u043B\u044C\u043D\u044B\u0439 \u0440\u0435\u0436\u0438\u043C \u0440\u0430\u0431\u043E\u0442\u044B \u0434\u0443\u043F\u043B\u0435\u043A\u0441\u0430 \u043E\u0431\u043D\u0430\u0440\u0443\u0436\u0435\u043D.
+endOfEmail = \u041E\u043A\u043E\u043D\u0447\u0430\u043D\u0438\u0435 \u044D\u043B\u0435\u043A\u0442\u0440\u043E\u043D\u043D\u043E\u0433\u043E \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F
+excLoss = \u0427\u0440\u0435\u0437\u043C\u0435\u0440\u043D\u044B\u0435 \u043F\u043E\u0442\u0435\u0440\u0438 \u0441\u0435\u0442\u0435\u0432\u044B\u0445 \u043F\u0430\u043A\u0435\u0442\u043E\u0432 \u0441\u043A\u0430\u0437\u044B\u0432\u0430\u0435\u0442\u0441\u044F \u043D\u0430 \u0440\u0430\u0431\u043E\u0442\u0435 \u0432\u0430\u0448\u0435\u0439 \u0441\u0435\u0442\u0438, \u043F\u0440\u043E\u0432\u0435\u0440\u044C\u0442\u0435 \u0444\u0443\u043D\u043A\u0446\u0438\u044E \u0430\u0432\u0442\u043E-\u0441\u043E\u0433\u043B\u0430\u0441\u043E\u0432\u0430\u043D\u0438\u044F \u0434\u0443\u043F\u043B\u0435\u043A\u0441\u0430 \u043D\u0430 \u0432\u0430\u0448\u0435\u043C \u041F\u041A \u0438 \u043D\u0430 \u0431\u043B\u0438\u0436\u0430\u0439\u0448\u0435\u043C \u0441\u0435\u0442\u0435\u0432\u043E\u043C \u0443\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432\u0435
+excessiveErrors = \u0412\u043D\u0438\u043C\u0430\u043D\u0438\u0435: \u0447\u0440\u0435\u0437\u043C\u0435\u0440\u043D\u043E\u0435 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u043E\u0448\u0438\u0431\u043E\u043A, \u043F\u0440\u043E\u0432\u0435\u0440\u044C\u0442\u0435 \u0441\u0435\u0442\u0435\u0432\u043E\u0439 \u043A\u0430\u0431\u0435\u043B\u044C(\u044B).
+firewallNo = \u043D\u0435 \u043D\u0430\u0445\u043E\u0434\u0438\u0442\u0441\u044F \u0437\u0430 \u043C\u0435\u0436\u0441\u0435\u0442\u0435\u0432\u044B\u043C \u044D\u043A\u0440\u0430\u043D\u043E\u043C. [\u041F\u043E\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 \u043A \u0432\u0438\u0440\u0442\u0443\u0430\u043B\u044C\u043D\u043E\u043C\u0443 \u043F\u043E\u0440\u0442 \u043F\u0440\u043E\u0448\u043B\u043E \u0443\u0441\u043F\u0435\u0448\u043D\u043E]
+firewallYes = \u0432\u0435\u0440\u043E\u044F\u0442\u043D\u043E \u0437\u0430 \u043C\u0435\u0436\u0441\u0435\u0442\u0435\u0432\u044B\u043C \u044D\u043A\u0440\u0430\u043D\u043E\u043C. [\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0438\u0442\u044C\u0441\u044F \u043A \u0432\u0438\u0440\u0442\u0443\u0430\u043B\u044C\u043D\u043E\u043C\u0443 \u043F\u043E\u0440\u0442\u0443]
+flowControlLimits = \u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u0443\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u044F \u0441\u0435\u0442\u0435\u0432\u044B\u043C \u043F\u043E\u0442\u043E\u043A\u043E\u043C \u043E\u0433\u0440\u0430\u043D\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u043F\u0440\u043E\u043F\u0443\u0441\u043A\u043D\u0443\u044E \u0441\u043F\u043E\u0441\u043E\u0431\u043D\u043E\u0441\u0442\u044C
+found100mbps = 100 \u041C\u0431\u0438\u0442/\u0441 FastEthernet \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0435 \u043E\u0431\u043D\u0430\u0440\u0443\u0436\u0435\u043D\u043E.
+found10gbps = 10 \u0413\u0431\u0438\u0442/\u0441 10 GigEthernet/OC-192 \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0435 \u043E\u0431\u043D\u0430\u0440\u0443\u0436\u0435\u043D\u043E.
+found10mbps = 10 \u041C\u0431\u0438\u0442/\u0441 Ethernet \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0435 \u043E\u0431\u043D\u0430\u0440\u0443\u0436\u0435\u043D\u043E.
+found1gbps = 1 \u0413\u0431\u0438\u0442/\u0441 GigabitEthernet \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0435 \u043E\u0431\u043D\u0430\u0440\u0443\u0436\u0435\u043D\u043E.
+found2.4gbps = 2,4 \u0413\u0431\u0438\u0442/\u0441 OC-48 \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0435 \u043E\u0431\u043D\u0430\u0440\u0443\u0436\u0435\u043D\u043E.
+found45mbps = 45 \u041C\u0431\u0438\u0442/\u0441 T3/DS3 \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0435 \u043E\u0431\u043D\u0430\u0440\u0443\u0436\u0435\u043D\u043E.
+found622mbps = 622 \u041C\u0431\u0438\u0442/\u0441 OC-12 \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0435 \u043E\u0431\u043D\u0430\u0440\u0443\u0436\u0435\u043D\u043E.
+foundDialup = \u041C\u043E\u0434\u0435\u043C\u043D\u043E\u0435 \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0435 \u043E\u0431\u043D\u0430\u0440\u0443\u0436\u0435\u043D\u043E.
+foundDsl = \u041A\u0430\u0431\u0435\u043B\u044C\u043D\u043E\u0435 modem/DSL/T1 \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0435 \u043E\u0431\u043D\u0430\u0440\u0443\u0436\u0435\u043D\u043E.
+fullDuplex = \u043F\u043E\u043B\u043D\u043E\u0434\u0443\u043F\u043B\u0435\u043A\u0441\u043D\u0430\u044F Fast Ethernet \u043F\u043E\u0434\u0441\u0435\u0442\u044C
+general= \u041E\u0431\u0449\u0438\u0435
+generatingReport = \u0413\u043E\u0442\u043E\u0432\u0438\u0442\u0441\u044F \u043E\u0442\u0447\u0435\u0442 \u043E \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0435: \u0414\u0430\u043D\u043D\u044B\u0439 \u043E\u0442\u0447\u0435\u0442 \u0431\u0443\u0434\u0435\u0442 \u0432\u044B\u0441\u043B\u0430\u043D \u0443\u043A\u0430\u0437\u0430\u043D\u043D\u044B\u043C \u043B\u0438\u0446\u0430\u043C
+getWeb100Var = \u041F\u043E\u043B\u0443\u0447\u0438\u0442\u044C WEB100 \u043F\u0435\u0440\u0435\u043C\u0435\u043D\u043D\u044B\u0435
+halfDuplex = \u043F\u043E\u043B\u0443\u0434\u0443\u043F\u043B\u0435\u043A\u0441\u043D\u0430\u044F Fast Ethernet \u043F\u043E\u0434\u0441\u0435\u0442\u044C ID = TCP/Web100 Network Diagnostic Tool (NDT)
+immediate = \u0441\u0438\u044E \u043C\u0438\u043D\u0443\u0442\u0443
+inboundTest = Tcpbw100 \u0432\u0445\u043E\u0434\u044F\u0449\u0438\u0439 \u0442\u0435\u0441\u0442 ...
+inboundWrongMessage = C2S \u0442\u0435\u0441\u0442 \u043D\u0430 \u043F\u0440\u043E\u043F\u0443\u0441\u043A\u043D\u0443\u044E \u0441\u043F\u043E\u0441\u043E\u0431\u043D\u043E\u0441\u0442\u044C:\u041F\u043E\u043B\u0443\u0447\u0435\u043D \u043D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u044B\u0439 \u0442\u0438\u043F \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F
+incompatibleVersion = \u041D\u0435\u0441\u043E\u0432\u043C\u0435\u0441\u0442\u0438\u043C\u0430\u044F \u0432\u0435\u0440\u0441\u0438\u044F
+incrRxBuf = \u0423\u0432\u0435\u043B\u0438\u0447\u0435\u043D\u0438\u0435 \u043F\u0440\u0438\u0435\u043C\u043D\u043E\u0433\u043E \u0431\u0443\u0444\u0435\u0440\u0430 \u043A\u043B\u0438\u0435\u043D\u0442\u0430
+incrTxBuf = \u0423\u0432\u0435\u043B\u0438\u0447\u0435\u043D\u0438\u0435 \u0431\u0443\u0444\u0435\u0440\u0430 \u043E\u0442\u043F\u0440\u0430\u0432\u043A\u0438 \u043D\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 NDT
+information = \u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F
+initialization = \u0418\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F ...
+insufficient = \u041D\u0435\u0434\u043E\u0441\u0442\u0430\u0442\u043E\u0447\u043D\u043E \u0434\u0430\u043D\u043D\u044B\u0445, \u0441\u043E\u0431\u0440\u0430\u043D\u043D\u044B\u0445 \u0434\u043B\u044F \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0442\u0438\u043F\u0430 \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u044F.
+invokingMailtoFunction = Tcpbw100 \u0412\u044B\u0437\u043E\u0432 \u0444\u0443\u043D\u043A\u0446\u0438\u0438 Mailto
+ipProtocol = \u0418\u043D\u0442\u0435\u0440\u043D\u0435\u0442 \u043F\u0440\u043E\u0442\u043E\u043A\u043E\u043B
+ipcFail = \u041C\u0435\u0436\u043F\u0440\u043E\u0446\u0435\u0441\u0441\u043D\u043E\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435 \u0431\u044B\u043B\u043E \u043D\u0430\u0440\u0443\u0448\u0435\u043D\u043E, \u0442\u0438\u043F \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u044F \u043D\u0435 \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D.
+usingIpv4 = -- \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u044E IPv4 \u0430\u0434\u0440\u0435\u0441
+usingIpv6 = -- \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u044E IPv6 \u0430\u0434\u0440\u0435\u0441
+javaData = Java \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438
+kbyteBufferLimits = \u041A\u0411\u0430\u0439\u0442 \u0440\u0430\u0437\u043C\u0435\u0440 \u0431\u0443\u0444\u0435\u0440\u0430, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u043E\u0433\u0440\u0430\u043D\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u043F\u0440\u043E\u043F\u0443\u0441\u043A\u043D\u0443\u044E \u0441\u043F\u043E\u0441\u043E\u0431\u043D\u043E\u0441\u0442\u044C
+limitNet = \u0441\u0435\u0442\u044C \u043E\u0433\u0440\u0430\u043D\u0438\u0447\u0435\u043D\u0430
+limitRx = \u043F\u0440\u0438\u0435\u043C\u043D\u0438\u043A \u043E\u0433\u0440\u0430\u043D\u0438\u0447\u0435\u043D
+limitTx = \u043E\u0442\u043F\u0440\u0430\u0432\u0438\u0442\u0435\u043B\u044C \u043E\u0433\u0440\u0430\u043D\u0438\u0447\u0435\u043D
+linkFullDpx = \u0421\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0435 \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E \u0432 \u043F\u043E\u043B\u043D\u044B\u0439 \u0434\u0443\u043F\u043B\u0435\u043A\u0441\u043D\u044B\u0439 \u0440\u0435\u0436\u0438\u043C
+linkHalfDpx =\u0421\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0435 \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E \u0432 \u043F\u043E\u043B\u0443\u0434\u0443\u043F\u043B\u0435\u043A\u0441\u043D\u043E\u043C \u0440\u0435\u0436\u0438\u043C\u0435
+loggingWrongMessage = \u0421\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435 \u043D\u0430 \u0441\u0435\u0440\u0432\u0435\u0440: \u041F\u043E\u043B\u0443\u0447\u0435\u043D \u043D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u044B\u0439 \u0442\u0438\u043F \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F
+lookupError = \u041D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0438\u0442\u044C \u0443\u0434\u0430\u043B\u0435\u043D\u043D\u044B\u0439 IP-\u0430\u0434\u0440\u0435\u0441
+mboxWrongMessage = \u0422\u0435\u0441\u0442 \u043F\u0440\u043E\u043C\u0435\u0436\u0443\u0442\u043E\u0447\u043D\u044B\u0445 \u0443\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432: \u041F\u043E\u043B\u0443\u0447\u0435\u043D \u043D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u044B\u0439 \u0442\u0438\u043F \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F
+meta = META
+metaFailed = META test FAILED!
+metaTest = META test...
+metaWrongMessage = META test: Received wrong type of the message
+middlebox = \u041F\u0440\u043E\u043C\u0435\u0436\u0443\u0442\u043E\u0447\u043D\u043E\u0435 \u0443\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432\u043E
+middleboxFail = \u0418\u0421\u0414 \u043D\u0435 \u0441\u043C\u043E\u0433 \u043F\u0440\u043E\u0442\u0435\u0441\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u043F\u0440\u043E\u043C\u0435\u0436\u0443\u0442\u043E\u0447\u043D\u043E\u0435 \u0443\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432\u043E
+middleboxFail2 = \u0422\u0435\u0441\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435 \u043F\u0440\u043E\u043C\u0435\u0436\u0443\u0442\u043E\u0447\u043D\u044B\u0445 \u0443\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432 \u0431\u044B\u043B\u043E \u043E\u0431\u043E\u0440\u0432\u0430\u043D\u043E !
+middleboxModifyingMss = \u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F: \u041F\u0440\u043E\u043C\u0435\u0436\u0443\u0442\u043E\u0447\u043D\u043E\u0435 \u0443\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432\u043E \u0441\u0435\u0442\u0438 \u0438\u0437\u043C\u0435\u043D\u044F\u0435\u0442 MSS(\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u044B\u0439 \u0440\u0430\u0437\u043C\u0435\u0440 \u0441\u0435\u0433\u043C\u0435\u043D\u0442\u0430 \u0434\u0430\u043D\u043D\u044B\u0445)
+middleboxTest = Tcpbw100 \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u0442 \u043F\u0440\u043E\u043C\u0435\u0436\u0443\u0442\u043E\u0447\u043D\u043E\u0435 \u0443\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432\u043E \u0441\u0435\u0442\u0438...
+moreDetails = \u041F\u043E\u0434\u0440\u043E\u0431\u043D\u0435\u0435 ...
+name = \u0438\u043C\u044F
+ndtServerHas = NDT \u0441\u0435\u0440\u0432\u0435\u0440
+noPktLoss1 = \u041F\u043E\u0442\u0435\u0440\u044C \u043F\u0430\u043A\u0435\u0442\u043E\u0432 \u043D\u0435 \u043E\u0431\u043D\u0430\u0440\u0443\u0436\u0435\u043D\u043E
+noPktLoss2 = \u041F\u043E\u0442\u0435\u0440\u044C \u043F\u0430\u043A\u0435\u0442\u043E\u0432 \u043D\u0435 \u043D\u0430\u0431\u043B\u044E\u0434\u0430\u043B\u043E\u0441\u044C
+numberOfTests = \u0447\u0438\u0441\u043B\u043E \u0442\u0435\u0441\u0442\u043E\u0432
+of =
+off = \u0412\u044B\u043A\u043B
+ok = \u0412\u0432\u0435\u0441\u0442\u0438
+oldDuplexMismatch = \u201C\u041F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u0435: \u0420\u0430\u043D\u0435\u0435 \u043E\u0431\u043D\u0430\u0440\u0443\u0436\u0435\u043D\u043D\u043E\u0435 \u043D\u0435\u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0435 \u0434\u0443\u043F\u043B\u0435\u043A\u0441\u0430 \u0441\u043D\u043E\u0432\u0430 \u0431\u044B\u043B\u043E \u043E\u0431\u043D\u0430\u0440\u0443\u0436\u0435\u043D\u043E:"
+on = \u0412\u043A\u043B
+ooOrder = \u043D\u043E \u043F\u0430\u043A\u0435\u0442\u044B \u043F\u0440\u0438\u0431\u044B\u043B\u0438 \u0432\u043D\u0435 \u043F\u043E\u0440\u044F\u0434\u043A\u0430
+options = \u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043E\u0432
+osData = \u0414\u0430\u043D\u043D\u044B\u0435 \u041E\u043F\u0435\u0440\u0430\u0446\u0438\u043E\u043D\u043D\u043E\u0439 \u0421\u0438\u0441\u0442\u0435\u043C\u044B:
+otherClient = \u0414\u0440\u0443\u0433\u043E\u0439 \u043A\u043B\u0438\u0435\u043D\u0442 \u0432 \u043D\u0430\u0441\u0442\u043E\u044F\u0449\u0435\u0435 \u0432\u0440\u0435\u043C\u044F \u043E\u0431\u0441\u043B\u0443\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044F, \u0432\u0430\u0448 \u0442\u0435\u0441\u0442 \u043D\u0430\u0447\u043D\u0435\u0442\u0441\u044F \u0432 \u0442\u0435\u0447\u0435\u043D\u0438\u0435
+otherTraffic = \u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F: \u041F\u043E\u0441\u0442\u043E\u0440\u043E\u043D\u043D\u0438\u0439 \u0442\u0440\u0430\u0444\u0438\u043A \u0437\u0430\u0431\u0438\u0432\u0430\u0435\u0442 \u0441\u0435\u0442\u0435\u0432\u043E\u0439 \u043B\u0438\u043D\u043A
+outboundTest = Tcpbw100 \u0438\u0441\u0445\u043E\u0434\u044F\u0449\u0438\u0439 \u0442\u0435\u0441\u0442 ...
+outboundWrongMessage = C2S \u0442\u0435\u0441\u0442 \u043D\u0430 \u043F\u0440\u043E\u043F\u0443\u0441\u043A\u043D\u0443\u044E \u0441\u043F\u043E\u0441\u043E\u0431\u043D\u043E\u0441\u0442\u044C: \u041F\u043E\u043B\u0443\u0447\u0435\u043D \u043D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u044B\u0439 \u0442\u0438\u043F \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F
+packetQueuing = \u041D\u0430\u043A\u043E\u043F\u043B\u0435\u043D\u0438\u0435 \u043F\u0430\u043A\u0435\u0442\u043E\u0432 \u0432 \u043E\u0447\u0435\u0440\u0435\u0434\u0438
+packetQueuingInfo = TCP (Transmission Control Protocol) \u043D\u0430\u0434\u0435\u0436\u043D\u043E \u043F\u0435\u0440\u0435\u0434\u0430\u0435\u0442 \u0434\u0430\u043D\u043D\u044B\u0435 \u043C\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043C\u044F\n \u0445\u043E\u0441\u0442\u0430\u043C\u0438 \u0432 \u0418\u043D\u0442\u0435\u0440\u043D\u0435\u0442\u0435. \u041E\u043D \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u043E\u0431\u043D\u0430\u0440\u0443\u0436\u0438\u0432\u0430\u0435\u0442 \u0438 \u0432\u043E\u0441\u0441\u0442\u0430\u043D\u0430\u0432\u043B\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u043F\u043E\u0441\u043B\u0435 \u043E\u0448\u0438\u0431\u043E\u043A \u0438\n \u043F\u043E\u0442\u0435\u0440\u044C. TCP \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442 \u0431\u0443\u0444\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u044E \u0447\u0442\u043E\u0431\u044B \u043E\u0431\u0435\u0441\u043F\u0435\u0447\u0438\u0442\u044C \u044D\u0442\u0443 \u043D\u0430\u0434\u0435\u0436\u043D\u043E\u0441\u0442\u044C. \u041A\u0440\u043E\u043C\u0435 \u0442\u043E\u0433\u043E,\n \u0432 \u0441\u0435\u0442\u0435\u0432\u044B\u0445 \u043A\u043E\u043C\u043C\u0443\u0442\u0430\u0442\u043E\u0440\u0430\u0445 \u0438 \u043C\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0442\u043E\u0440\u0430\u0445 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F \u0431\u0443\u0444\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u044F \u0432 \u0441\u043B\u0443\u0447\u0430\u044F\u0445, \u043A\u043E\u0433\u0434\u0430 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u043E \u0432\u0445\u043E\u0434\u044F\u0449\u0438\u0445 \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0439 \n \u043E\u0442\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0442 \u043F\u0430\u043A\u0435\u0442\u044B \u0432 \u043E\u0434\u043D\u043E \u0438\u0441\u0445\u043E\u0434\u044F\u0449\u0435\u0435 \u0438\u043B\u0438 \u043A\u043E\u0433\u0434\u0430 \u0441\u043A\u043E\u0440\u043E\u0441\u0442\u044C \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u044F \u0438\u0437\u043C\u0435\u043D\u044F\u0435\u0442\u0441\u044F \n (\u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440 \u0441 FastEthernet \u0434\u043E DSL \u043C\u043E\u0434\u0435\u043C\u0430).\n\n NDT \u0441\u0435\u0440\u0432\u0435\u0440 \u043F\u043E\u0441\u044B\u043B\u0430\u0435\u0442 \u043A\u0430\u0436\u0434\u044B\u0435 10 \u0441\u0435\u043A\u0443\u043D\u0434 \u0434\u0430\u043D\u043D\u044B\u0435 \u043A\u043B\u0438\u0435\u043D\u0442\u0443.\n \u0412 \u043D\u0435\u043A\u043E\u0442\u043E\u0440\u044B\u0445 \u0441\u043B\u0443\u0447\u0430\u044F\u0445 \u0441\u0435\u0440\u0432\u0435\u0440 \u043C\u043E\u0436\u0435\u0442 \u0433\u0435\u043D\u0435\u0440\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u043F\u043E\u0441\u044B\u043B\u0430\u0435\u043C\u044B\u0435 \u0434\u0430\u043D\u043D\u044B\u0435 \u0431\u044B\u0441\u0442\u0440\u0435\u0435, \u0447\u0435\u043C \u043C\u043E\u0436\u0435\u0442 \u043F\u043E\u0441\u044B\u043B\u0430\u0442\u044C \u043F\u0430\u043A\u0435\u0442\u044B\n \u0432 \u0441\u0435\u0442\u044C (\u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440 \u0432 \u0441\u043B\u0443\u0447\u0430\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0441 \u043F\u0440\u043E\u0446\u0435\u0441\u0441\u043E\u0440\u043E\u043C 2 \u0413\u0413\u0446 \u043E\u0442\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0435\u0433\u043E \u0434\u0430\u043D\u043D\u044B\u0435 \u043D\u0430 \u043A\u043B\u0438\u0435\u043D\u0442\u0430 \u0447\u0435\u0440\u0435\u0437 DSL).\n \u041A\u043E\u0433\u0434\u0430 \u044D\u0442\u043E \u0441\u043B\u0443\u0447\u0430\u0435\u0442\u0441\u044F, \u043D\u0435\u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u043F\u0430\u043A\u0435\u0442\u044B \u043C\u043E\u0433\u0443\u0442 \u043E\u0441\u0442\u0430\u0432\u0430\u0442\u044C\u0441\u044F \u043D\u0430 \u0432\u044B\u0445\u043E\u0434\u043D\u043E\u0439 \u043E\u0447\u0435\u0440\u0435\u0434\u044C\u044C\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\n \u0434\u0430\u0436\u0435 \u043A\u043E\u0433\u0434\u0430 10-\u0442\u0438 \u0441\u0435\u043A\u0443\u043D\u0434\u043D\u044B\u0439 \u0442\u0430\u0439\u043C\u0435\u0440 \u0438\u0441\u0442\u0435\u0447\u0435\u0442. TCP \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0438\u0442\n \u043E\u0442\u043F\u0440\u0430\u0432\u043B\u044F\u0442\u044C \u044D\u0442\u0438 \u043F\u0430\u043A\u0435\u0442\u044B \u0438\u0437 \u043E\u0447\u0435\u0440\u0435\u0434\u0438, \u0438 \u043A\u043B\u0438\u0435\u043D\u0442 \u0431\u0443\u0434\u0435\u0442 \u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0430\u0442\u044C \u043F\u0440\u0438\u043D\u0438\u043C\u0430\u0442\u044C \u0438\n \u043E\u0431\u0440\u0430\u0431\u043E\u0442\u0430\u0442\u044C \u044D\u0442\u0438 \u0432\u0445\u043E\u0434\u044F\u0449\u0438\u0435 \u043F\u0430\u043A\u0435\u0442\u044B. \u042D\u0442\u043E \u043F\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u043A\n \u0442\u043E\u043C\u0443 \u0447\u0442\u043E \u0442\u0435\u0441\u0442 \u043C\u043E\u0436\u0435\u0442 \u0437\u0430\u0442\u044F\u043D\u0443\u0442\u044C\u0441\u044F.\n\n \u042D\u0442\u043E \u0441\u043B\u0443\u0447\u0438\u043B\u043E\u0441\u044C \u0432\u043E \u0432\u0440\u0435\u043C\u044F \u044D\u0442\u043E\u0433\u043E \u0442\u0435\u0441\u0442\u0430. \u041D\u0438\u043A\u0430\u043A\u0438\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043F\u0440\u0435\u0434\u043F\u0440\u0438\u043D\u0438\u043C\u0430\u0442\u044C \u043D\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044F, \u0447\u0442\u043E\u0431\u044B\n \u0440\u0435\u0448\u0438\u0442\u044C \u044D\u0442\u0443 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0443.
+packetSizePreserved = \u0420\u0430\u0437\u043C\u0435\u0440 \u043F\u0430\u043A\u0435\u0442\u0430 \u043D\u0435 \u0438\u0437\u043C\u0435\u043D\u0438\u043B\u0441\u044F \u043D\u0430 \u0432\u0441\u0435\u043C \u043F\u0443\u0442\u0438
+packetsize = \u0440\u0430\u0437\u043C\u0435\u0440 \u043F\u0430\u043A\u0435\u0442\u0430
+pc = \u041F\u041A
+pctOfTime =% \u0432\u0440\u0435\u043C\u0435\u043D\u0438
+performedTests = \u0417\u0430\u043A\u043E\u043D\u0447\u0435\u043D\u043D\u044B\u0435 \u0442\u0435\u0441\u0442\u044B
+pktsRetrans = \u043F\u0430\u043A\u0435\u0442\u044B \u043F\u0435\u0440\u0435\u0441\u043B\u0430\u043D\u043D\u044B\u0435 \u043F\u043E\u0432\u0442\u043E\u0440\u043D\u043E
+possibleDuplexFullHalf = \u0412\u043D\u0438\u043C\u0430\u043D\u0438\u0435: \u041E\u0431\u043D\u0430\u0440\u0443\u0436\u0435\u043D\u043E \u0412\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0435 \u041D\u0435\u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0435 \u0434\u0443\u043F\u043B\u0435\u043A\u0441\u0430 Switch=\u0434\u0443\u043F\u043B\u0435\u043A\u0441 \u0438 Host=\u043F\u043E\u043B\u0443\u0434\u0443\u043F\u043B\u0435\u043A\u0441
+possibleDuplexHalfFull = \u0412\u043D\u0438\u043C\u0430\u043D\u0438\u0435: \u041E\u0431\u043D\u0430\u0440\u0443\u0436\u0435\u043D\u043E \u0412\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0435 \u041D\u0435\u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0435 \u0434\u0443\u043F\u043B\u0435\u043A\u0441\u0430 Switch=\u043F\u043E\u043B\u0443\u0434\u0443\u043F\u043B\u0435\u043A\u0441 \u0438 Host=\u0434\u0443\u043F\u043B\u0435\u043A\u0441
+possibleDuplexHalfFullWarning = \u041F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u0435: \u041E\u0431\u043D\u0430\u0440\u0443\u0436\u0435\u043D\u043E \u0412\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0435 \u041D\u0435\u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0435 \u0434\u0443\u043F\u043B\u0435\u043A\u0441\u0430 Switch=\u043F\u043E\u043B\u0443\u0434\u0443\u043F\u043B\u0435\u043A\u0441 \u0438 Host=\u0434\u0443\u043F\u043B\u0435\u043A\u0441
+preferIPv6 = \u043F\u0440\u0435\u0434\u043F\u043E\u0447\u0438\u0442\u0435\u043D\u0438\u0435 IPv6
+printDetailedStats = \u041D\u0430\u043F\u0435\u0447\u0430\u0442\u0430\u0442\u044C \u041F\u043E\u0434\u0440\u043E\u0431\u043D\u0443\u044E \u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043A\u0443
+protocolError = \u041E\u0448\u0438\u0431\u043A\u0430 \u043F\u0440\u043E\u0442\u043E\u043A\u043E\u043B\u0430! \u041E\u0436\u0438\u0434\u0430\u043B\u043E\u0441\u044C 'prepare', \u043F\u043E\u043B\u0443\u0447\u0438\u043B\u0438: 0x
+qSeen = \u0442\u0435\u0441\u0442 \u043D\u0430 \u043F\u0440\u043E\u043F\u0443\u0441\u043A\u043D\u0443\u044E \u0441\u043F\u043E\u0441\u043E\u0431\u043D\u043E\u0441\u0442\u044C: \u041E\u0431\u043D\u0430\u0440\u0443\u0436\u0435\u043D\u043E \u043D\u0430\u043A\u043E\u043F\u043B\u0435\u043D\u0438\u0435 \u043F\u0430\u043A\u0435\u0442\u043E\u0432 \u0432 \u043E\u0447\u0435\u0440\u0435\u0434\u0438
+ready = Tcpbw100 \u0433\u043E\u0442\u043E\u0432
+receiveBufferShouldBe = \u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F: \u041F\u0440\u0438\u0435\u043C\u043D\u044B\u0439 \u0431\u0443\u0444\u0435\u0440 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C
+receiving = \u041F\u043E\u043B\u0443\u0447\u0435\u043D\u0438\u0435 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u0432 ...
+reportProblem = \u0421\u043E\u043E\u0431\u0449\u0438\u0442\u044C \u043E \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0435
+resultsParseError = \u041E\u0448\u0438\u0431\u043A\u0430 \u043F\u0440\u0438 \u0440\u0430\u0437\u0431\u043E\u0440\u0435 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u0432 \u0442\u0435\u0441\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F!
+resultsTimeout = \u041F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u0435! \u041A\u043B\u0438\u0435\u043D\u0442 \u043E\u0442\u0432\u0430\u043B\u0438\u043B\u0441\u044F \u043F\u043E \u0442\u0430\u0439\u043C-\u0430\u0443\u0442\u0443 \u043F\u0440\u0438 \u0447\u0442\u0435\u043D\u0438\u0438 \u0434\u0430\u043D\u043D\u044B\u0445, \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E \u043D\u0435\u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0434\u0443\u043F\u043B\u0435\u043A\u0441\u0430
+resultsWrongMessage = \u0420\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u044B \u0442\u0435\u0441\u0442\u043E\u0432: \u041F\u043E\u043B\u0443\u0447\u0435\u043D \u043D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u044B\u0439 \u0442\u0438\u043F \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F
+rtt = RTT
+rttFail = \u0430\u043B\u0433\u043E\u0440\u0438\u0442\u043C \u043E\u0431\u043D\u0430\u0440\u0443\u0436\u0435\u043D\u0438\u044F \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u044F \u043D\u0435 \u0441\u0440\u0430\u0431\u043E\u0442\u0430\u043B \u0438\u0437-\u0437\u0430 \u0447\u0440\u0435\u0437\u043C\u0435\u0440\u043D\u043E\u0439 \u0434\u0432\u0443\u0445\u0441\u0442\u043E\u0440\u043E\u043D\u043D\u0435\u0439 \u0437\u0430\u0434\u0435\u0440\u0436\u043A\u0438 (RTT).
+runningInboundTest = \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 10-\u0442\u0438 \u0441\u0435\u043A\u0443\u043D\u0434\u043D\u044B\u0439 \u0442\u0435\u0441\u0442 \u0432\u0445\u043E\u0434\u044F\u0449\u0438\u0445 \u043F\u0430\u043A\u0435\u0442\u043E\u0432 (\u043E\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043A \u043A\u043B\u0438\u0435\u043D\u0442\u0443 [S2C]). . . . . .
+runningOutboundTest = \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 10-\u0442\u0438 \u0441\u0435\u043A\u0443\u043D\u0434\u043D\u044B\u0439 \u0442\u0435\u0441\u0442 \u0438\u0441\u0445\u043E\u0434\u044F\u0449\u0438\u0445 \u043F\u0430\u043A\u0435\u0442\u043E\u0432 (\u043A\u043B\u0438\u0435\u043D\u0442-\u0441\u0435\u0440\u0432\u0435\u0440 [C2S]). . . . .
+S2C = S2C
+s2cPacketQueuingDetected = [S2C]: \u041E\u0431\u043D\u0430\u0440\u0443\u0436\u0435\u043D\u043E \u043D\u0430\u043A\u043E\u043F\u043B\u0435\u043D\u0438\u0435 \u043F\u0430\u043A\u0435\u0442\u043E\u0432 \u0432 \u043E\u0447\u0435\u0440\u0435\u0434\u0438
+s2cThroughput = S2C \u043F\u0440\u043E\u043F\u0443\u0441\u043A\u043D\u0430\u044F \u0441\u043F\u043E\u0441\u043E\u0431\u043D\u043E\u0441\u0442\u044C
+s2cThroughputFailed = S2C \u0442\u0435\u0441\u0442 \u043D\u0430 \u043F\u0440\u043E\u043F\u0443\u0441\u043A\u043D\u0443\u044E \u0441\u043F\u043E\u0441\u043E\u0431\u043D\u043E\u0441\u0442\u044C \u041D\u0415 \u0421\u0420\u0410\u0411\u041E\u0422\u0410\u041B !
+sackReceived = \u0431\u043B\u043E\u043A\u0438 SACK \u043F\u043E\u043B\u0443\u0447\u0435\u043D\u044B
+scalingFactors = \u0424\u0430\u043A\u0442\u043E\u0440\u044B \u041C\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F
+seconds = \u0441\u0435\u043A\u0443\u043D\u0434
+sendingMetaInformation = Sending META information . . . . . . . . . . . . . . . . . . .
+server = \u0421\u0435\u0440\u0432\u0435\u0440
+serverAcksReport = \u0421\u0435\u0440\u0432\u0435\u0440 \u043E\u0442\u0432\u0435\u0442\u0438\u043B \u0441 Ack \u0447\u0442\u043E \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0435
+serverBusy = \u0421\u0435\u0440\u0432\u0435\u0440 \u0437\u0430\u043D\u044F\u0442: \u0421\u043B\u0438\u0448\u043A\u043E\u043C \u043C\u043D\u043E\u0433\u043E \u043A\u043B\u0438\u0435\u043D\u0442\u043E\u0432 \u043E\u0436\u0438\u0434\u0430\u044E\u0442 \u0432 \u043E\u0447\u0435\u0440\u0435\u0434\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430. \u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u043F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u0435 \u043F\u043E\u043F\u044B\u0442\u043A\u0443 \u043F\u043E\u0437\u0436\u0435
+serverBusy15s = \u0421\u0435\u0440\u0432\u0435\u0440 \u0437\u0430\u043D\u044F\u0442: \u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u043F\u043E\u0434\u043E\u0436\u0434\u0438\u0442\u0435 15 \u0441\u0435\u043A\u0443\u043D\u0434 \u043F\u043E\u043A\u0430 \u0437\u0430\u043A\u043E\u043D\u0447\u0438\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0438\u0439 \u0442\u0435\u0441\u0442
+serverBusy30s = \u0421\u0435\u0440\u0432\u0435\u0440 \u0437\u0430\u043D\u044F\u0442: \u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u043F\u043E\u0434\u043E\u0436\u0434\u0438\u0442\u0435 30 \u0441\u0435\u043A\u0443\u043D\u0434 \u043F\u043E\u043A\u0430 \u0437\u0430\u043A\u043E\u043D\u0447\u0438\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0438\u0439 \u0442\u0435\u0441\u0442
+serverBusy60s = \u0421\u0435\u0440\u0432\u0435\u0440 \u0437\u0430\u043D\u044F\u0442: \u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u043F\u043E\u0434\u043E\u0436\u0434\u0438\u0442\u0435 60 \u0441\u0435\u043A\u0443\u043D\u0434 \u043F\u043E\u043A\u0430 \u0437\u0430\u043A\u043E\u043D\u0447\u0438\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0438\u0439 \u0442\u0435\u0441\u0442
+serverDataReports = \u0414\u0430\u043D\u043D\u044B\u0435 \u0441 \u0421\u0435\u0440\u0432\u0435\u0440\u0430 \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u044E\u0442 \u0447\u0442\u043E \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0435
+serverFail Server = \u041E\u0448\u0438\u0431\u043A\u0430 \u043F\u0440\u0438 \u043F\u043E\u043B\u0443\u0447\u0435\u043D\u0438\u0438 \u0434\u0430\u043D\u043D\u044B\u0445
+serverIpModified = \u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F: \u0443\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432\u043E \u043F\u0440\u0435\u043E\u0431\u0440\u0430\u0437\u043E\u0432\u0430\u043D\u0438\u044F \u0441\u0435\u0442\u0435\u0432\u044B\u0445 \u0430\u0434\u0440\u0435\u0441\u043E\u0432 (NAT) \u0438\u0437\u043C\u0435\u043D\u044F\u0435\u0442 IP-\u0430\u0434\u0440\u0435\u0441 \u043A\u043B\u0438\u0435\u043D\u0442\u0430
+serverIpPreserved = IP \u0430\u0434\u0440\u0435\u0441\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0431\u044B\u043B\u0438 \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u044B \u0431\u0435\u0437 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0439 \u043D\u0430 \u0432\u0441\u0435\u043C \u043F\u0443\u0442\u0438
+serverNotRunning = \u0421\u0435\u0440\u0432\u0435\u0440\u043D\u044B\u0439 \u043F\u0440\u043E\u0446\u0435\u0441\u0441 \u043D\u0435 \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442: \u0437\u0430\u043F\u0443\u0441\u0442\u0438\u0442\u0435 \u043F\u0440\u043E\u0446\u0435\u0441\u0441 web100srv \u043D\u0430 \u0443\u0434\u0430\u043B\u0435\u043D\u043D\u043E\u043C \u0441\u0435\u0440\u0432\u0435\u0440\u0435
+serverSays = \u0421\u0435\u0440\u0432\u0435\u0440 \u0441\u043E\u043E\u0431\u0449\u0430\u0435\u0442
+sfwFail = \u041F\u0440\u043E\u0441\u0442\u043E\u0439 \u0442\u0435\u0441\u0442 \u043D\u0430 \u043C\u0435\u0436\u0441\u0435\u0442\u0435\u0432\u043E\u0439 \u044D\u043A\u0440\u0430\u043D \u041D\u0415 \u041F\u0420\u041E\u0428\u0415\u041B!
+sfwSocketFail = \u041F\u0440\u043E\u0441\u0442\u043E\u0439 \u0442\u0435\u0441\u0442 \u043D\u0430 \u043C\u0435\u0436\u0441\u0435\u0442\u0435\u0432\u043E\u0439 \u044D\u043A\u0440\u0430\u043D: \u041D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E \u0441\u043E\u0437\u0434\u0430\u0442\u044C \u0441\u0435\u0440\u0432\u0435\u0440\u043D\u044B\u0439 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u043D\u044B\u0439 \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441 (socket)
+sfwTest = \u041F\u0440\u043E\u0441\u0442\u043E\u0439 \u0442\u0435\u0441\u0442 \u043D\u0430 \u043C\u0435\u0436\u0441\u0435\u0442\u0435\u0432\u043E\u0439 \u044D\u043A\u0440\u0430\u043D...
+sfwWrongMessage = \u041F\u0440\u043E\u0441\u0442\u043E\u0439 \u0442\u0435\u0441\u0442 \u043D\u0430 \u043C\u0435\u0436\u0441\u0435\u0442\u0435\u0432\u043E\u0439 \u044D\u043A\u0440\u0430\u043D: \u041F\u043E\u043B\u0443\u0447\u0435\u043D \u043D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u044B\u0439 \u0442\u0438\u043F \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F
+showOptions = \u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438
+simpleFirewall = \u041F\u0440\u043E\u0441\u0442\u043E\u0439 \u043C\u0435\u0436\u0441\u0435\u0442\u0435\u0432\u043E\u0439 \u044D\u043A\u0440\u0430\u043D
+sleep10m = \u0417\u0430\u0434\u0440\u0435\u043C\u0430\u043B \u043D\u0430 10 \u043C\u0438\u043D\u0443\u0442 ...
+sleep1m = \u0417\u0430\u0434\u0440\u0435\u043C\u0430\u043B \u043D\u0430 1 \u043C\u0438\u043D ...
+sleep30m = \u0417\u0430\u0434\u0440\u0435\u043C\u0430\u043B \u043D\u0430 30 \u043C\u0438\u043D\u0443\u0442 ...
+sleep5m = \u0417\u0430\u0434\u0440\u0435\u043C\u0430\u043B \u043D\u0430 5 \u043C\u0438\u043D\u0443\u0442 ...
+sleep12h = \u0417\u0430\u0434\u0440\u0435\u043C\u0430\u043B \u043D\u0430 12 \u0447\u0430\u0441\u043E\u0432 ...
+sleep1d = \u0417\u0430\u0434\u0440\u0435\u043C\u0430\u043B \u043D\u0430 1 \u0434\u0435\u043D\u044C ...
+sleep2h = \u0417\u0430\u0434\u0440\u0435\u043C\u0430\u043B \u043D\u0430 2 \u0447\u0430\u0441\u0430 ...
+start = \u0421\u0422\u0410\u0420\u0422
+startingTest = \u041D\u0430\u0447\u0438\u043D\u0430\u0435\u043C \u0442\u0435\u0441\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435
+statistics = \u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043A\u0430
+stop = \u0421\u0422\u041E\u041F
+stopped = \u0422\u0435\u0441\u0442\u044B \u0431\u044B\u043B\u0438 \u043E\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u044B!
+stopping = O\u0441\u0442\u0430\u043D\u0430\u0432\u043B\u0438\u0432\u0430\u0435\u043C\u0441\u044F...
+systemFault = \u0421\u0438\u0441\u0442\u0435\u043C\u043D\u0430\u044F \u043D\u0435\u043F\u043E\u043B\u0430\u0434\u043A\u0430
+test = \u0422\u0415\u0421\u0422
+testsuiteWrongMessage = \u041E\u0431\u043C\u0435\u043D \u0441\u043E\u043E\u0431\u0448\u0435\u043D\u0438\u0439 \u043E \u043D\u0430\u0431\u043E\u0440\u0435 \u0442\u0435\u0441\u0442\u043E\u0432: \u041F\u043E\u043B\u0443\u0447\u0435\u043D \u043D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u044B\u0439 \u0442\u0438\u043F \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F
+theSlowestLink = \u0421\u0430\u043C\u043E\u0435 \u043C\u0435\u0434\u043B\u0435\u043D\u043D\u043E\u0435 \u0437\u0432\u0435\u043D\u043E \u043D\u0430 \u0432\u0441\u0435\u043C \u043F\u0440\u043E\u0442\u044F\u0436\u0435\u043D\u0438\u0438 \u0441\u0435\u0442\u0438
+theoreticalLimit = \u0422\u0435\u043E\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043A\u0438\u0439 \u043F\u0440\u0435\u0434\u0435\u043B \u043F\u0440\u043E\u043F\u0443\u0441\u043A\u043D\u043E\u0439 \u0441\u043F\u043E\u0441\u043E\u0431\u043D\u043E\u0441\u0442\u0438 \u0441\u0435\u0442\u0438
+thisConnIs = \u042D\u0442\u043E \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0435
+timesPktLoss = \u0440\u0430\u0437 \u0438\u0437-\u0437\u0430 \u043F\u043E\u0442\u0435\u0440\u0438 \u043F\u0430\u043A\u0435\u0442\u043E\u0432
+toMaximizeThroughput = \u043A\u0431\u0430\u0439\u0442 \u0447\u0442\u043E\u0431\u044B \u0443\u0432\u0435\u043B\u0438\u0447\u0438\u0442\u044C \u043F\u0440\u043E\u043F\u0443\u0441\u043A\u043D\u0443\u044E \u0441\u043F\u043E\u0441\u043E\u0431\u043D\u043E\u0441\u0442\u044C \u0441\u0435\u0442\u0438
+troubleReportFrom = \u041E\u0442\u0447\u0435\u0442 \u0418\u0421\u0414 \u043E \u043D\u0430\u0439\u0434\u0435\u043D\u043D\u044B\u0445 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0430\u0445 \u043D\u0430
+unableToDetectBottleneck = \u0421\u0435\u0440\u0432\u0435\u0440 \u043D\u0435 \u043C\u043E\u0436\u0435\u0442 \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0438\u0442\u044C \u0442\u0438\u043F \u0441\u0435\u0442\u0435\u0432\u043E\u0433\u043E \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u044F \u043D\u0430 \u0441\u0430\u043C\u043E\u043C \u043C\u0435\u0434\u043B\u0435\u043D\u043D\u043E\u043C \u0437\u0432\u0435\u043D\u0435 \u0441\u0435\u0442\u0438.
+unableToObtainIP = \u041D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u044B\u0439 IP \u0430\u0434\u0440\u0435\u0441
+unknownID = \u041D\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043D\u044B\u0439 \u0438\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440(ID) \u0442\u0435\u0441\u0442\u0430
+unknownServer = \u0421\u0435\u0440\u0432\u0435\u0440 \u043D\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043D
+unsupportedClient = \u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F: \u0441\u0435\u0440\u0432\u0435\u0440 \u043D\u0435 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u044D\u0442\u043E\u0433\u043E \u043A\u043E\u043C\u043C\u0430\u043D\u0434\u043D\u043E\u0433\u043E \u043A\u043B\u0438\u0435\u043D\u0442\u0430
+vendor = \u041F\u0440\u043E\u0438\u0437\u0432\u043E\u0434\u0438\u0442\u0435\u043B\u044C
+version = \u0412\u0435\u0440\u0441\u0438\u044F
+versionWrongMessage = \u0412\u044B\u044F\u0441\u043D\u0435\u043D\u0438\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u0418\u0421\u0414: \u041F\u043E\u043B\u0443\u0447\u0435\u043D \u043D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u044B\u0439 \u0442\u0438\u043F \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F
+web100Details = WEB100 \u041F\u043E\u0434\u0440\u043E\u0431\u043D\u044B\u0439 \u041E\u0442\u0447\u0435\u0442
+web100KernelVar = WEB100 \u043F\u0435\u0440\u0435\u043C\u0435\u043D\u043D\u044B\u0435 \u044F\u0434\u0440\u0430
+web100Stats = WEB100 \u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043A\u0430 \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u0430
+web100Var = WEB100 \u043F\u0435\u0440\u0435\u043C\u0435\u043D\u043D\u044B\u0435
+web100rtt = WEB100 \u0441\u043E\u043E\u0431\u0449\u0430\u0435\u0442 \u043E \u0442\u0443\u0434\u0430-\u043E\u0431\u0440\u0430\u0442\u043D\u043E\u0439 \u0437\u0430\u0434\u0435\u0440\u0436\u043A\u0435 (RTT)
+web100tcpOpts = WEB100 \u0441\u043E\u043E\u0431\u0449\u0430\u0435\u0442 \u043E \u0442\u043E\u043C \u0447\u0442\u043E \u0432 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u0435 \u043E\u0431\u043C\u0435\u043D\u0430 TCP \u0431\u044B\u043B\u0438 \u043D\u0430\u0439\u0434\u0435\u043D\u044B \u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0435 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B \u043F\u0440\u043E\u0438\u0437\u0432\u043E\u0434\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u0438:
+willImprove = \u043F\u043E\u0437\u0432\u043E\u043B\u0438\u0442 \u043F\u043E\u0432\u044B\u0441\u0438\u0442\u044C \u043F\u0440\u043E\u0438\u0437\u0432\u043E\u0434\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0439
+workstation = \u0420\u0430\u0431\u043E\u0447\u0430\u044F \u0421\u0442\u0430\u043D\u0446\u0438\u044F
+your = \u0412\u0430\u0448
+yourPcHas = \u0423 \u0412\u0430\u0448\u0435\u0433\u043E \u041F\u041A/\u0420\u0430\u0431\u043E\u0447\u0435\u0439 \u0421\u0442\u0430\u043D\u0446\u0438\u0438 \u0435\u0441\u0442\u044C
+connectingTo = \u041F\u043E\u0434\u043A\u043B\u044E\u0447\u0430\u0435\u043C\u0441\u044F \u043A
+toRunTest = \u043F\u0440\u043E\u0432\u0435\u0441\u0442\u0438 \u0442\u0435\u0441\u0442
+t1Str = T1
+t3Str = T3;
+ethernetStr = Ethernet
+fastEthernet = FastE
+oc12Str = OC-12
+gigabitEthernetStr = GigE
+oc48Str = OC-48
+tengigabitEthernetStr = 10 Gig
+systemFaultStr = systemFault
+dialupStr = dialup2
+rttStr = rtt
=======================================
--- /dev/null
+++ /trunk/flash-client/src/ndt_test_results.as Sun Feb 2 19:14:17 2014 UTC
@@ -0,0 +1,18 @@
+// Copyright 2013 M-Lab
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package {
+ // Defined to limit visibility of TestResults variables to TestResultsUtils.
+ namespace ndt_test_results;
+}



Archive powered by MHonArc 2.6.16.

Top of Page