IT虾米网

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

hnrainll 2025年05月04日 程序员 29 0

问候,

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

请您参考如下方法:

在发送数据包时创建时间戳,当手机收到数据包时也会生成时间戳。然后用手机时间戳减去 PC 时间戳即可得到时差。然后发送的字节数除以时间间隔即可得出每次字节数间隔速度。

例如

接收时间 - 发送时间 = 时间间隙”//假设 2 毫秒 //当你发送数据包时,你发送了 8 个字节,所以: 8/2 = 4字节/秒//(字节/时间间隙 = 速度)


评论关闭
IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!