【问题标题】:C++ calculate socket transfer speedC++计算套接字传输速度
【发布时间】:2016-05-25 16:01:19
【问题描述】:

你好,

我想测量在我的 PC 上运行的应用程序和通过无线网络连接的手机之间的传输速度。我的手机正在运行 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 的数据,所以没有办法是准确的。然后我开始测量发送整个数据包所花费的时间,但这又没有帮助,因为这样我正在测量操作系统填充套接字缓冲区的速度:(

【问题讨论】:

  • 您需要测量延迟还是吞吐量?您是只对往返时间感兴趣,还是对单程时间感兴趣?
  • 我对往返延迟和吞吐量都很感兴趣。所以两者都是。

标签: android c++ multithreading sockets


【解决方案1】:

在发送数据包时创建一个时间戳,当手机收到数据包时也会生成一个时间戳。然后用 PC 时间戳从手机时间戳中减去时间,得到一个时差。然后发送的字节数除以时间间隔将为您提供每时间间隔的字节数。

例如

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)

【讨论】:

  • 只要您的计算机和手机时间同步到毫秒内,这将起作用,这可能是现实的,也可能是不现实的。
  • 我无法更改 Android 设备上的数据。这就是要求。我只能回显数据。
  • 我认为您没有看到我的评论。我有一个限制,我不能更改电话应用程序,所以我不能让它发送收到数据包的时间戳。
猜你喜欢
  • 2011-03-09
  • 1970-01-01
  • 2019-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多