C++, Ununtu 16.04 LTS, Компилятор g++
Всем доброго времени. Пишу клиент-серверное приложение. Задача довольно простая : передать файл от сервера клиенту. Отправляю клиенту размер файла, делю этот размер на 1024, чтобы получить количество пакетов, которое я должен получить (я отправляю по 1024 байта). С этой частью все в порядке. Когда начинается работа циклов for и while, то тут я сталкиваюсь с проблемой, что сервер быстренько обрабатывает все свои write, заталкивает весь файл в буфер и ждет. Клиент же читает почему-то только первые сколько-нибудь пакетов и потом останавливается на какой-то итерации. Далее - когда я в окне с сервером прерываю серверный процесс (ctrl+C на Ubuntu), то клиент сразу докачивает остальное до конца. Я не устанавливал неблокирующие сокеты. Не понимаю, в чем дело. Объясните, пожалуйста, если в курсе.
Клиент :
void Client::download(std::string filename)
{
std::ofstream ofs(filename, std::ofstream::app);
int nBytesReceived;
int nFileLength = 0;
int nPackages = 0;
char buffer[1024];
memset(buffer, '\0', sizeof(buffer));
//Получение длины файла
nBytesReceived = read(sockfd, buffer, sizeof(buffer));
if (nBytesReceived < 0)
error("ERROR reading from socket");
//Length of the file
nFileLength = atoi(buffer);
nPackages = nFileLength % BUF > 0
? nFileLength / BUF + 1
: nFileLength / BUF;
//Тут происходит передача файла
for(int i = 0; i<nPackages; ++i){
//Read from the socket
nBytesReceived = read(sockfd, buffer, sizeof(buffer));
if (nBytesReceived < 0)
error("ERROR reading from socket");
ofs<<buffer;
}
ofs.close();
}
Сервер :
void Server::upload(std::string filename, int nFilePos){
std::ifstream ifs(filename, std::ifstream::in);
char buffer[BUF];
memset(buffer, 0, sizeof(buffer));
ifs.seekg(0, ifs.end);
int nFileLength = ifs.tellg();
//Тут происходит отправка длины файла
nBytesSent = write(newsockfd, std::to_string(nFileLength).c_str()
, strlen(std::to_string(nFileLength).c_str()));
if (nBytesSent < 0)
error("ERROR writing to pipe");
this->send();
ifs.seekg(0, ifs.beg);
//Тут происходит передача файла
while (!ifs.eof()){
ifs.read(buffer, BUF);
nBytesSent = write(newsockfd, buffer, strlen(buffer));
if (nBytesSent < 0)
error("ERROR writing to pipe");
}
ifs.close();
}
Ваш сервер пишет пакеты длиной
strlen(buffer)
А клиент читает пакет длиной
sizeof(buffer)
Дальше два варианта:
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости