Привет реализовали простой обмен файлами через соединение клиент / сервер в c ++. Работает нормально, за исключением одной проблемы, которая так чертовски медленно. Это мой код:
Для отправки файла:
int send_file(int fd)
{
char rec[10];
struct stat stat_buf;
fstat (fd, &stat_buf);
int size=stat_buf.st_size;
while(size > 0)
{
char buffer[1024];
bzero(buffer,1024);
bzero(rec,10);
int n;
if(size>=1024)
{
n=read(fd, buffer, 1024);
// Send a chunk of data
n=send(sockFile_, buffer, n, 0 );
// Wait for an acknowledgement
n = recv(sockFile_, rec, 10, 0 );
}
else // reamining file bytes
{
n=read(fd, buffer, size);
buffer[size]='\0';
send(sockFile_,buffer, n, 0 );
n=recv(sockFile_, rec, 10, 0 ); // ack
}
size -= 1024;
}
// Send a completion string
int n = send(sockFile_, "COMP",strlen("COMP"), 0 );
char buf[10];
bzero(buf,10);
// Receive an acknowledgemnt
n = recv(sockFile_, buf, 10, 0 );
return(0);
}
А для получения файла:
int receive_file(int size, const char* saveName)
{
ofstream outFile(saveName,ios::out|ios::binary|ios::app);
while(size > 0)
{
// buffer for storing incoming data
char buf[1024];
bzero(buf,1024);
if(size>=1024)
{
// receive chunk of data
n=recv(sockFile_, buf, 1024, 0 );
// write chunk of data to disk
outFile.write(buf,n);
// send acknowledgement
n = send(sockFile_, "OK", strlen("OK"), 0 );
}
else
{
n=recv(sockFile_, buf, size, 0 );
buf[size]='\0';
outFile.write(buf,n);
n = send(sockFile_, "OK", strlen("OK"), 0 );
}
size -= 1024;
}
outFile.close();
// Receive 'COMP' and send acknowledgement
// ---------------------------------------
char buf[10];
bzero(buf,10);
n = recv(sockFile_, buf, 10, 0 );
n = send(sockFile_, "OK", strlen("OK"), 0 );
std::cout<<"File received..."<<std::endl;
return(0);
}
Теперь вот мои первые мысли: возможно, буфер слишком мал. Поэтому я должен попытаться увеличить размер с не знаю, 1024 байта (1 КБ) до 65536 (64 КБ) блоков, возможно. Но это приводит к повреждению файла. Итак, возможно, код также замедляется из-за необходимости получать подтверждение после отправки каждого 1024-байтового блока данных, так почему бы не удалить их? К сожалению, это приводит к тому, что блоки поступают не в правильном порядке и, следовательно, к повреждению файла.
Возможно, я мог бы разбить файл на части заранее, создать несколько соединений и отправить каждый кусок через свое резьбовое соединение, а затем как-нибудь собрать куски в приемнике ....
Есть идеи, как сделать процесс передачи файлов более эффективным (более быстрым)?
Спасибо,
Бен.