Bandwidth.cpp
上传用户:xuqiang_fz
上传日期:2021-05-30
资源大小:2k
文件大小:7k
源码类别:

Modem编程

开发平台:

C/C++

  1. /*
  2. //     
  3. // Name: Bandwidth restriction for UNIX 
  4. //     pipes
  5. // Description:Slowpipe allows the restr
  6. //     iction of bandwidth on a modem network c
  7. //     onnection where a Unix pipe may be used.
  8. //     It was written to address a problem for 
  9. //     users of a small network connected to a 
  10. //     larger network with a low bandwidth conn
  11. //     ection. 
  12. if you use such a connection for both interactive work, and transfer of large files it is possible that using programs such as ftp will consume all available bandwith, making the use of terminal emulators, X-windows etc., near impossible until the transfer is complete. 
  13. Slowpipe is a simple pipe filter intended to pass all characters through unchanged, but to limit the transfer rate. It does not however have any special knowledge of TCP/IP or other protocols. You may wish to change the packet sizes to multiples of the MTU to your host network for optimal performance if you are able to establish this. The default values though have been found to work satisfactorily on more than one network. The ideal solution is to reconfigure the router to your host network to restrict bandwidth on specific ranges of TCP/IP port numbers though this was not possible in my case. 
  14. Slowpipe has been tested under Linux and AIX and appears to perform as expected - though I offer no guarantees as this is free software. The user of the software must test their build. No liabilty shall be accepted for failure to perform as expected or consequential damages. 
  15. I emphasise that this is a simple solution and better solutions may exist - but it solved our problem. 
  16. // By: Found on the World Wide Web
  17. //
  18.  
  19. The timing loop assumes that it takes zero time to read from the standard input. You will find the actual transfer rates to be marginally incorrect, though they are accurate enough to provide control. 
  20. Transfer rates are specified in kilobytes per second. As a guidline, try about one third of the rate you can achieve with ftp. 
  21. Example: to copy a directory tree to the home directory on a remote system 
  22. tar cvf - | slowpipe 2.0 | rsh remotehost tar xvf - 
  23. where remotehost is the name of the remote system 
  24. */     
  25. /* 
  26. * Title:  Slowpipe.C
  27. * Description: Bandwidth restriction for UNIX pipes
  28. */
  29. #include <sys/time.h>
  30. #include <stdio.h>
  31. #include <unistd.h>
  32. #include <stdlib.h>
  33. int main(int argc, char **argv)
  34.     {
  35.      FILE *fd;
  36.      char c;
  37.      char *buffer;
  38.      int bufsiz = 16;
  39.      int i;
  40.      int sleep = 0;
  41.      int full = 0;
  42.      struct timeval tval;
  43.      double kps = 2.0,bps,pps;
  44.      unsigned long t_s, t_us;
  45.      if(argc != 2)
  46.          {
  47.          perror("Usage slowpipe <K per second e.g. 6.0>");
  48.          exit(1);
  49.          }
  50.          sscanf(argv[1],"%lg",&kps);
  51.          if ( kps > 10.0 )
  52.              {
  53.              bufsiz = 1024;
  54.              }
  55.              else if ( kps > 5.0 )
  56.                  {
  57.                  bufsiz = 512;
  58.                  }
  59.                  else if ( kps > 2.0 )
  60.                      {
  61.                      bufsiz = 256;
  62.                      }
  63.                      else if ( kps > 1.0 )
  64.                          {
  65.                          bufsiz = 128;
  66.                          }
  67.                          else if ( kps > 0.5 )
  68.                              {
  69.                              bufsiz = 64;
  70.                              }
  71.                              bps = 1024.0 * kps;
  72.                              pps = bps / bufsiz;
  73.                              if(pps > 1.0)
  74.                                  {
  75.                                  t_s = 0.0;
  76.                                  t_us= 1.0e6 / pps;
  77.                                  }
  78.                                  else
  79.                                      {
  80.                                      t_s = 1.0 / pps;
  81.                                      t_us = 0;
  82.                                      }
  83.                                      fprintf(stderr,"%6.2g K per second, bufsiz = %dn",kps,bufsiz); 
  84.                                      buffer = malloc(bufsiz);
  85.                                      if(!buffer)
  86.                                          {
  87.                                          perror("Unable to allocate buffer");
  88.                                          exit(1);
  89.                                          }
  90.                                          i = 0;
  91.                                          while (1)
  92.                                              {
  93.                                              if (!full)
  94.                                                  {
  95.                                                  if(i < bufsiz)
  96.                                                      {
  97.                                                      buffer[i] = fgetc(stdin);
  98.                                                      if(feof(stdin))
  99.                                                          {
  100.                                                          fwrite(buffer,1,i,stdout);
  101.                                                          break;
  102.                                                          }
  103.                                                          if(++i == bufsiz)
  104.                                                              {
  105.                                                              full = !0;
  106.                                                              }
  107.                                                                      }
  108.                                                              }
  109.                                                             else
  110.                                                             {
  111.                                                              /* go for a blocking select since the buffer is full */
  112.                                                tval.tv_sec = t_s;
  113.                                                                 tval.tv_usec = t_us;
  114.                                                             select ( 0, 0, 0, 0, &tval );
  115.                                                                 fwrite(buffer,1,bufsiz,stdout);
  116.                                                                 full = 0;
  117.                                                                 i = 0;
  118.                                                              }
  119.                                                    }
  120.                                                                  free(buffer);
  121.                                                             }