1

Тема: AHK: Узнать скорость интернет-соединения

Хеллоу.
У меня возник вопрос: возможно-ли как-то через DDL узнать скорость интернета, не отправляя запросы к сайту?

2

Re: AHK: Узнать скорость интернет-соединения

А что такое DDL? И скорость чего измерять, если никакая информация не передаётся? Можно узнать у провайдера, какая скорость заявлена.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK: Узнать скорость интернет-соединения

teadrinker, извиняюсь, ошибся, DLL*.

4 (изменено: kuakua_kuakua333, 2017-08-01 21:57:11)

Re: AHK: Узнать скорость интернет-соединения

teadrinker, ну какие-никакие файлы все равно передаются всегда, вот хотелось бы узнать, как мониторить это дело.
Или же смотрите, я передаю json объект на сервер через WinHttpRequest.5.1, можно-ли тогда узнать, какова была скорость интернета при отправке данных?

5

Re: AHK: Узнать скорость интернет-соединения

kuakua_kuakua333 пишет:

какие-никакие файлы все равно передаются всегда, вот хотелось бы узнать, как мониторить это дело.

Писал когда-то:

#Persistent
TrafficMonitoring(1000)
Return

TrafficMonitoring(period := 0)  {
   static IsSet
   
   if !IsSet  {
      IsSet := true
      UpdateTraffic()
      SetTimer, % A_ThisFunc, % period
      Return
   }
   obj := UpdateTraffic()
   TrayTip,, % "Downloaded: " . obj.Downloaded
             . "`nUploaded: " . obj.Uploaded
             . "`nUploadBytePerSec: " . obj.UploadBytePerSec
             . "`nDownloadBytePerSec: " . obj.DownloadBytePerSec
}

UpdateTraffic()  {
   static dnOld, upOld, IsSet, TrInfo, timeOld

   if !IsSet {
      IsSet := true
      TrInfo := new TrafficInfo
      data := TrInfo.GetInfo()
      dnOld := data.dn
      upOld := data.up
      timeOld := A_TickCount
      Return
   }

   data := TrInfo.GetInfo()
   dnNew := data.dn
   upNew := data.up

   timeNew := A_TickCount
   elapsedSec := (timeNew - timeOld)/1000
   dnRate := Round( (dnNew - dnOld) / elapsedSec )
   upRate := Round( (upNew - upOld) / elapsedSec )

   timeOld := timeNew
   dnOld := dnNew
   upOld := upNew

   Return { Downloaded: dnNew, Uploaded: upNew, UploadBytePerSec: upRate, DownloadBytePerSec: dnRate }
}

class TrafficInfo  {
   __New()  {
      static MIB_IF_ROW2
      this.hModule := DllCall("LoadLibrary", Str, "Iphlpapi.dll", Ptr)

      VarSetCapacity(MIB_IF_ROW2, 1352, 0)
      this.pData := &MIB_IF_ROW2

      DllCall("iphlpapi\GetBestInterface", Ptr, 0, PtrP, IfIndex)
      NumPut(IfIndex, this.pData + 8)
   }
   
   __Get(key)  {
      if key in dn,up
         Return NumGet(this.pData + (key = "dn" ? 1256 : 1320), "Int64")
   }

   __Delete()  {
      DllCall("FreeLibrary", Ptr, this.hModule)
   }

   GetInfo()  {
      DllCall("iphlpapi\GetIfEntry2", Ptr, this.pData)
      Return { dn: this.dn, up: this.up }
   }
}

Значения Downloaded и Uploaded — это в байтах с начала сессии, можно проверить, если щёлкнуть в папке «Сетевые подключения» по текущему подключению. Значения UploadBytePerSec и DownloadBytePerSec — сколько отправлено и загружено в последнюю секунду.

kuakua_kuakua333 пишет:

json объект на сервер через WinHttpRequest.5.1, можно-ли тогда узнать, какова была скорость интернета при отправке данных?

Тут всё просто — определить, сколько байт в JSON, засечь время, определить, сколько времени заняла отправка, когда она будет завершена.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

6

Re: AHK: Узнать скорость интернет-соединения

teadrinker, феенкс, то есть мне просто перед запросом указать функцию TrafficMonitoring(1000) и все?

7

Re: AHK: Узнать скорость интернет-соединения

Нет, она мониторит только общий траффик. Перед запросом:

teadrinker пишет:

определить, сколько байт в JSON, засечь время, определить, сколько времени заняла отправка, когда она будет завершена

и поделить байты на время.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

8

Re: AHK: Узнать скорость интернет-соединения

Раньше Speedtest.net позволял устанавливать тестилку на сайт. Но можно и просто какой-нибудь файл известного размера скачивать и время засекать.

date = %A_DD% %A_MMM% %A_Hour%:%A_Min%
StartTime := A_TickCount
UrlDownloadToFile, http://grisha.unixserv.ru/speedtest/speedtest/random2000x2000.jpg, %A_Temp%\speedtest
EndTime := A_TickCount
If !ErrorLevel ; если не произошло ошибок
	{
	FileGetSize, filesize, %A_Temp%\speedtest ; определяется размер скачанного файла в байтах
	Calc := filesize*8/(10**6) ; определяется размер скачанного файла в мегабитах
	Calc := Round(Calc/((EndTime - StartTime)/1000),2) ; определяется средняя скорость загрузки
	FileAppend, %date%%A_Tab%DL %Calc% Mbit/s`r`n, history.ini ; результат записывается в журнал
	}
Else FileAppend,%date%%A_Tab%ERROR`r`n, history.ini