读取文本文件片段并写入boost时出错.asio插座

eof error reading pieces of text file and writing to boost.asio socket

本文关键字:boost 出错 asio 插座 取文本 文件 片段 读取      更新时间:2023-10-16

我正在尝试一次读取1kB的文件,并使用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)您没有正确地测试流的错误或eof条件。

试试这个:

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