Веб-сервер - отправка файлов большего размера, чем несколько байтов - PullRequest
1 голос
/ 24 ноября 2011

У меня проблема с отправкой файлов большего размера, чем несколько байтов (т.е. 700 байт) по какой-то причине я могу загрузить файл меньшего размера, чем когда-либо, но когда я пытаюсь загрузить любой файл большего размера, это говорит мне в моем браузере (Chrome) - Download Stopped (т.е. 251/700 B - остановлено) похоже, он загружает только 251 байт, а затем останавливается

это мой код: Web_Connection.h

#include <string>
#include <fstream>
#include <boost/bind.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/enable_shared_from_this.hpp>
#include <boost/asio.hpp>

using boost::asio::ip::tcp;

class web_connection : public boost::enable_shared_from_this<web_connection>
{
public:
    typedef boost::shared_ptr<web_connection> pointer;

    static pointer create(boost::asio::io_service& io_service)
    {
        return pointer(new web_connection(io_service));
    }

    tcp::socket& socket()
    {
        return socket_;
    }

    void start()
    {
        std::filebuf *pbuf;
        std::ifstream sourcestr;
        long size;
        char * buffer;

        sourcestr.open("file-copy.exe",std::ios::in | std::ios::binary);

        // get pointer to associated buffer object
        pbuf=sourcestr.rdbuf();

        // get file size using buffer's members
        size=pbuf->pubseekoff (0,std::ios::end,std::ios::in);
        pbuf->pubseekpos (0,std::ios::in);

        // allocate memory to contain file data
        buffer=new char[size];

        // get file data  
        pbuf->sgetn (buffer,size);

        // download file http headers
        std::stringstream stream;
        stream << "HTTP/1.0 200 OK\r\n"
                    "Content-Description: File Transfer\r\n"
                    "Content-Type: application/octet-stream\r\n"
                    "Content-Transfer-Encoding: binary\r\n"
                    "Content-Disposition: attachment; filename=file.exe\r\n"
                    "Expires: 0\r\n"
                    "Cache-Control: must-revalidate, post-check=0, pre-check=0'\r\n"
                    "Pragma: public\r\n"
                    "Content-Length: " << size << "\r\n\r\n";

        message_ = stream.str();
        message_.append(buffer, size);

        /*message_ = "HTTP/1.0 200 OK\r\n"
                    "Content-Type: text/html\r\n\r\n";*/

        boost::asio::async_write(socket_, boost::asio::buffer(message_),
            boost::bind(&web_connection::handle_write, shared_from_this(),
                boost::asio::placeholders::error,
                    boost::asio::placeholders::bytes_transferred));
    }

private:
    web_connection(boost::asio::io_service& io_service): socket_(io_service)
    {}

    void handle_write(const boost::system::error_code& error,size_t bytes_transferred)
    {
    }

    tcp::socket socket_;
    std::string message_;
};

Web Server.h

#include "web_connection.h"

class web_server
{
public:
    web_server(unsigned short port)
    {
        try
        {
            acceptor_ = new tcp::acceptor(io_service, tcp::endpoint(tcp::v4(), port));
            start_accept();
            io_service.run();
        }
        catch (std::exception& e)
        {
            std::cerr << e.what() << std::endl;
        }
    }

    ~web_server()
    {
        delete acceptor_;
    }

private:
    void start_accept()
    {
        web_connection::pointer new_connection = web_connection::create(acceptor_->get_io_service());

        acceptor_->async_accept(new_connection->socket(),
            boost::bind(&web_server::handle_accept, this, new_connection,
                boost::asio::placeholders::error));
    }

    void handle_accept(web_connection::pointer new_connection, const boost::system::error_code& error)
    {
        if (!error)
        {
            new_connection->start();
            start_accept();
        }
    }
    boost::asio::io_service io_service;
    tcp::acceptor* acceptor_;
};

Редакция: Мне почти удалось решить эту проблему, установив заголовки так:

    stream << "HTTP/1.0 200 OK\r\n"
                "Content-Description: File Transfer\r\n"
                "Content-Type: application/octet-stream\r\n"
                "Content-Transfer-Encoding: binary\r\n"
                "Content-Disposition: attachment; filename=example.exe\r\n"
                "Expires: 0\r\n"
                "Cache-Control: must-revalidate, post-check=0, pre-check=0'\r\n"
                "Pragma: public\r\n"
                "Content-Length: " << size << "\r\n\r\n";

так как моей целью было загрузить exe-файл ..

но по какой-то причине получаю доступ к http://127.0.0.1:8080, не всегда загружая файл иногда это показывает мне ту же ошибку Последняя ошибка: Код ошибки, выданный asyc_write: 10054 категория: система и в моем браузере: (Chrome: Example.exe 536/542 КБ - Stoppd)

но когда я обновляю страницу несколько раз, она наконец работает: S как я могу сделать так, чтобы он всегда работал?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...