Страница 1 из 1

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

Добавлено: 01 окт 2010, 17:22
urdnot
Есть сервер который написан на C++ работает под линуксом. Он передает файлы при помощи TCP/ip через один порт. Максимальная скорость которой я добился 400кб. Как ускорить передачу? Мне интерестны все варианты

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

Добавлено: 01 окт 2010, 18:19
BulldozerBSG
Что то маловато как для 100Mb сети. Код в студию.

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

Добавлено: 01 окт 2010, 18:32
urdnot

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

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;
}

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

Добавлено: 01 окт 2010, 18:50
BulldozerBSG
Я думаю что у вас маленький размер буфера. Из за этого может быть слишком много обращений к операциям с фалом и сети.

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

Добавлено: 01 окт 2010, 19:06
azrael
А не пробовали сервер и клиент на одной машине запускать и соединяться через loopback-интерфейс? Какая скорость?

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

Добавлено: 01 окт 2010, 19:11
urdnot
Размер буфера я разный дела ощутимого эффекта это не давало.

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