C ++计算套接字传输速度

时间:2016-05-25 16:01:20

标签: android c++ multithreading sockets

Greetigs,

我想测量在我的电脑上运行的应用程序和通过无线网络连接的手机之间的传输速度。我的手机正在运行Android,并充当回声服务器。它通过套接字收到的所有内容都会回传。

在PC端,我写了一个有两个线程的小应用程序。一个生成数据包(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())返回的字节,并有一个定时器测量一秒。当计时器到期时,我会将累积的字节作为写入速度。但是这产生了12MB / s并且我花了30次发送12mb的数据,所以没有办法是准确的。然后我开始测量发送整个数据包的时间,但这又没有帮助,因为这样我测量操作系统填充套接字缓冲区的速度:(

1 个答案:

答案 0 :(得分:0)

在发送数据包时创建时间戳,当手机重新获取数据包时,也会生成时间戳。然后从电话时间戳中减去PC时间戳的时间,以给出时间差。然后发送的字节除以时间间隔将为您提供每个时间间隔的字节速度。

e.g。

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)