C++ вычислить скорость передачи сокета

Greetigs,

Я хочу измерить скорость передачи между приложением, работающим на моем компьютере, и телефоном, который подключен через беспроводную сеть. Мой телефон работает под управлением Android и действует как эхо-сервер. Все, что он получает через розетку, отзывается эхом.

На стороне ПК я написал небольшое приложение, которое имеет два потока. Один генерирует пакеты (128K, но я могу управлять им) и отправляет их на телефон (WriteThread). Пакеты имеют значение метки времени в начале, показывающее время отправки пакета. После отправки всего пакета поток записи ожидает сигнала события. Событие сигнализируется потоком чтения после получения всего пакета. Поток чтения извлекает временную метку из пакета и вычисляет задержку обратного хода — время, необходимое для передачи пакета к телефону и возврата.

Мои розетки с обеих сторон (телефон и ПК ) не блокируются.

Моя программа написана на C++:

// WriteThread
int totalBytesWritten = 0;
int bytesWritten = 0;
const int packetSize = 128 * 1024;
char pBuffer[packetSize];
int packetCount = 1000;
int iterations = packetCount;

while ( iterations > 0 )
{
   if ( totalBytesWritten < bytesWritten )
   {
     if ( generatePacketEvent.isSignaled() )
     {
        GenerateBuffer( pBuffer, packetSize );
        generatePacketEvent.Reset();
        totalBytesWritten = 0;
        iterations --;
     }

     int bytesWritten = CSocketUtils::Write( m_socket, pBuffer + totalBytesWritten, packetSize - totalBytesWritten );
     if ( bytesWritten > 0 ) totalBytesWritten += bytesWritten;
   }
}

// Read thread
int totalBytesRead = 0;
int bytesRead = 0;
int expectedPackets = 100;
int packetsReceived = 0;
const int packetSize = 128 * 1024;
char pBuffer[packetSize];

while ( packetsReceived < packetsExpected )
{
   if ( totalBytesReceived < packetSize )
   {
      bytesRead = CSocketUtils::Read( m_socket, pBuffer + totalBytesRead, packetSize - totalBytesRead );
      if ( bytesRead > 0 )
      {
        totalBytesRead += bytesRead;
      }
   }
   else
   {
      totalBytesRead = 0;
      packetReceivedEvent.Signal();

      uint32_t timestamp = 0;
      memcpy( &timestamp, pBuffer, sizeof( uint32_t ) );
      uint32_t roundtrip = CurrentTimeMilliseconds() - timestamp;
   }
}

// Generate Buffer data
void GenerateBuffer( char* pBuffer, int size )
{
    uint32_t timestamp = CurrentTimeMilliseconds();
    memcpy( pBuffer, &timestamp, sizeof( uint32_t ) );
    for (int i = sizeof( uint32_t ); i < size; i ++ )
    {
      pBuffer[i] = rand() % 255;
    }
}

Как бы я измерил скорость, с которой мое приложение отправляет / получает данные на / с моего телефона?

Я не могу изменить приложение Echo телефона, чтобы изменить пакеты, которые он получает! Таким образом, нет способа добавить метку времени на стороне телефона.

Сначала я накапливал байты, возвращенные CSocketUtils:: Write ( который вызывает send ()), и имел таймер, измеряющий одну секунду. Когда таймер истечет, я возьму накопленные байты в качестве скорости записи. Но это произвело 12 МБ/с, и мне потребовалось 30sto, чтобы отправить 12 МБ данных, поэтому нет никакого способа, который является точным. Затем я начал измерять время, необходимое для отправки всего пакета, но это снова не помогло, потому что таким образом я измеряю, как быстро ОС заполняет буфер сокета 🙁

1 ответ

  1. Создайте метку времени при отправке пакета, когда телефон восстановит пакет, а затем создайте метку времени. Затем вычесть время из метки времени телефона по метке времени ПК, чтобы дать вам разницу во времени. После этого байты отправленные разделенные промежутком времени передадут вам ваша скорость интервала байт-в-времени.

    например.

    recive time - sent time = time gap" // lets say 2ms
    // When you sent the packet, you sent 8 bytes, so:
    8 / 2 = 4bytes/s //(bytes / timegap = speed)