Передача фалов по сети

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
urdnot
Сообщения: 3
Зарегистрирован: 01 окт 2010, 17:02

Есть сервер который написан на C++ работает под линуксом. Он передает файлы при помощи TCP/ip через один порт. Максимальная скорость которой я добился 400кб. Как ускорить передачу? Мне интерестны все варианты
BulldozerBSG
Сообщения: 270
Зарегистрирован: 09 янв 2010, 04:14
Контактная информация:

Что то маловато как для 100Mb сети. Код в студию.
urdnot
Сообщения: 3
Зарегистрирован: 01 окт 2010, 17:02

Код: Выделить всё

FRESULT send_file( const char* file_name , const char* path )
{
    TCP_MSG pack;
    int buffer_len = MAX_BUF_LEN;
    int num_of_packets = 0;

    strcat( path, file_name );
    
    int fp;
    if( !(fp = open( path, O_RDONLY )) )
    {
         printf( "Cannot open %s.\n", path );
	 return F_FAIL;
    }

    struct stat statbuf;
    fstat( fp, &statbuf );

    pack.option = SANS_INFO;
    strcpy( pack.msg.buf , file_name );
    if( send( &pack, sizeof(pack), 0 ) == F_FAIL )
      return F_FAIL;
    
    off_t offset = 0;
    int bites = 0;

   //собственно вот тут передача файла
    while( bites != statbuf.st_size )
    {
      int nResult =  sendfile( m_socket_id , fp, &offset ,buffer_len );
      if( nResult == -1 )
          printf("Error\n");

      bites += nResult;
      if(( statbuf.st_size - bites ) < MAX_BUF_LEN )
	buffer_len =  statbuf.st_size - bites;
    }

    ::close( fp );
    return F_OK;
}

FRESULT recv_file()
{
  FILE* new_file = NULL;
  TCP_MSG pack;
  if( CSocket::recv( &pack, sizeof(pack), 0 ) == F_FAIL )
        return F_FAIL;
  
  if( !( new_file = fopen( pack.msg.buf, "wb" ) ) )
  {
      displayError( "Target file cannot create\n" );
      return F_FAIL;
  }
  
  char tmp[MAX_BUF_LEN];
  int bites = 0;

  //вот тут он принимается
  //CSocket::recv   это обычный recv

  while( (bites = CSocket::recv( tmp, MAX_BUF_LEN, 0) ) > 0 )
    fwrite( tmp, bites, 1, new_file );
  
  fclose( new_file );
  return F_OK;
}
BulldozerBSG
Сообщения: 270
Зарегистрирован: 09 янв 2010, 04:14
Контактная информация:

Я думаю что у вас маленький размер буфера. Из за этого может быть слишком много обращений к операциям с фалом и сети.
azrael
Сообщения: 89
Зарегистрирован: 31 май 2009, 15:30
Контактная информация:

А не пробовали сервер и клиент на одной машине запускать и соединяться через loopback-интерфейс? Какая скорость?
urdnot
Сообщения: 3
Зарегистрирован: 01 окт 2010, 17:02

Размер буфера я разный дела ощутимого эффекта это не давало.

А по loopback я гонял и все в порядке было. Точно не считал какая скорость. Отличалась на порядки
Ответить