Передача фалов по сети
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
Есть сервер который написан на C++ работает под линуксом. Он передает файлы при помощи TCP/ip через один порт. Максимальная скорость которой я добился 400кб. Как ускорить передачу? Мне интерестны все варианты
-
- Сообщения: 270
- Зарегистрирован: 09 янв 2010, 04:14
- Контактная информация:
Что то маловато как для 100Mb сети. Код в студию.
Код: Выделить всё
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;
}
-
- Сообщения: 270
- Зарегистрирован: 09 янв 2010, 04:14
- Контактная информация:
Я думаю что у вас маленький размер буфера. Из за этого может быть слишком много обращений к операциям с фалом и сети.
А не пробовали сервер и клиент на одной машине запускать и соединяться через loopback-интерфейс? Какая скорость?
Размер буфера я разный дела ощутимого эффекта это не давало.
А по loopback я гонял и все в порядке было. Точно не считал какая скорость. Отличалась на порядки
А по loopback я гонял и все в порядке было. Точно не считал какая скорость. Отличалась на порядки