如何准确计算上传速度

时间:2015-08-10 09:40:09

标签: android sockets bandwidth

我想在Android设备中计算上传速度。为此,我创建了一个套接字服务器,我通过socket从我的Android设备发送1 MB数据。通过将字节数除以计算上传速度的时间。

面临的问题是,当我使用1 MB数据计算上传速度时,它几乎是使用1/2 MB数据计算的1.5倍。我无法找到问题。

这是我用C计算上传速度的代码。这是1MB数据。对于1/2 MB数据,我只需将字节更改为524288,并且从Android发送时也是如此。

 int sock = *(int*)socket_desc;
int read_size;  
char client_message[1048576];//1048576
int rc = 0;
int temp;
double Bandwidth;
int result[1];
double t;
struct timeval  tv1, tv2;

          read_size = 0;
          temp = 0;
          gettimeofday(&tv1, NULL);
          read_size = recv(sock , client_message ,sizeof(client_message), 0); 


          if(read_size < (1048576)){
read_again1:  temp = read_size;
             read_size = 0;
             read_size = recv(sock , client_message+temp , (sizeof(client_message)-temp), 0); 
             read_size+=temp;
             temp=0; 
             if(read_size < (1048576))
                goto read_again1; 
          }  

         gettimeofday(&tv2, NULL);
         t =  (double) (tv2.tv_usec - tv1.tv_usec) / 1000000 +
            (double) (tv2.tv_sec - tv1.tv_sec);

          read_size*=8;
          read_size/=1024;
          Bandwidth = read_size/t;

          result[0]= (int) Bandwidth;
          rc = send(sock , result , 4, 0);

          read_size = recv(sock , client_message ,1024, 0); 

        if(read_size == 0){
           exit_thr = 1;
           rc = close(sock);
           pthread_exit(&exit_thr);
        }
        else if(read_size == -1){
                rc = close(sock);
                pthread_exit(&exit_thr);
        }     

这是我的Android端代码:

 byte buffer[] = new byte[1048576];
         byte recvBuff[] = new byte[4]; 
         String strHexNumber, strHexNumber1= "";

       for(i=0;i<1048576;i++) 
        buffer[i] = (byte)i;

       try {
        bandwidth = 0;
        strHexNumber = strHexNumber1 ="";
         InetAddress addr = InetAddress.getByName("52.28.xxx.xx");

        Socket socket = new Socket();
        socket.connect(new InetSocketAddress(addr,8xxx));

        BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());


           bos.write(buffer);

           BufferedInputStream bos1 = new BufferedInputStream(socket.getInputStream());

           bos1.read(recvBuff,0,4);

在上面的代码中,可能会丢失一些大括号。此代码仅包含带宽的处理部分,其他部分类似于连接接受被省略

1 个答案:

答案 0 :(得分:1)

在您的Java代码中,您假设read()填充缓冲区,并且您没有检查它返回-1。

在您的C代码中,您不会检查recv()返回-1还是零。这段代码令人难以置信的复杂,看到它所要做的就是读取固定数量的字节。循环后最终读取的目的完全逃脱了我。