eof ошибка чтения фрагментов текстового файла и записи в сокет boost.asio - PullRequest
0 голосов
/ 19 июля 2011

Я пытаюсь прочитать файл по 1 КБ за раз и записать каждый фрагмент данных в сокет, используя boost.asio.Проблема в том, что когда мне нужно прочитать последний фрагмент данных из текстового файла и поместить его в буфер, кажется, что он не работает.

Мне нужен способ печати последней части буфера безпечать всего буфера (поскольку он содержит остатки от предыдущей итерации цикла)

int portNumber = 2002;
boost::asio::io_service io_service;
tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4(), portNumber));
tcp::socket socket(io_service);
acceptor.accept(socket);
boost::system::error_code ignored_error;

 int length;
char* buffer = new char[1025];//1024 bytes for data, 1 byte for seqNum
//get file stream and open local file.
ifstream stream;
stream.open("SampleFile.txt", ios::binary);
stream.seekg(0, ios::end);
length = stream.tellg();
stream.seekg(0, ios::beg);

 while (!stream.eof())
    {
        //char sequenceNumber = '0';

        stream.read(buffer, 1024);
        buffer[1024] = sequenceNumber;//set last pos to seq num
        boost::asio::write(socket, boost::asio::buffer(buffer),
                            boost::asio::transfer_all(), ignored_error);
               .
               .   //do other things
               .
    }

Это в конечном итоге запишет все в сокет (при условии, что клиентский конец взаимодействует), за исключением того, что часть концафайл будет записан дважды.

1 Ответ

2 голосов
/ 19 июля 2011

1) Вы неправильно вычисляете размер конечного буфера.

2) Вы неправильно проверяете поток на наличие ошибок или условий.

Попробуйте это:

while (stream)
{
    stream.read(buffer, 1024);
    buffer[1024] = sequenceNumber++;//set last pos to seq num
    boost::asio::write(socket, boost::asio::buffer(buffer, stream.gcount()),
                        boost::asio::transfer_all(), ignored_error);
    ...   
}
...