• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            我的玻璃盒子

            (轉(zhuǎn)載)使用完成端口HTTP下載的代碼

            原文連接:http://www.shnenglu.com/jinq0123/archive/2007/12/24/CompletionPortExamples.html


            試運行asio的async_client例程時,發(fā)現(xiàn)CPU占用很高,
            所以又寫了一個相同功能但直接調(diào)用完成端口API的代碼,
            進(jìn)行比較,發(fā)現(xiàn)同樣占用CPU。
            與flashget比較,下載速度差不多,但flashget不占CPU。
            將直接API調(diào)用代碼和利用asio的代碼都列在下面。
            進(jìn)行測試時,要將其中的參數(shù)定義改改,如SERVER參數(shù)。
            并且要找個大文件下載才有明顯結(jié)果。
            #include <iostream>
            #include <winsock2.h>
            // Modify these:
            // "http://server.test.com/jinq/test.zip"
            #define SERVER "server.test.com"
            #define REQ_PATH "/jinq/test.zip"
            const char * SVR_IP = "127.0.0.1";
            int main(int argc, char* argv[])
            {
                // Init.
                WSADATA wsd;
                WSAStartup(MAKEWORD(2, 2), &wsd);
                HANDLE hCp = CreateIoCompletionPort(
                    INVALID_HANDLE_VALUE, NULL, 0, 0);
                SOCKET skt = WSASocket(AF_INET,
                    SOCK_STREAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED);
                assert(INVALID_SOCKET != skt);
                // connect skt and request
                SOCKADDR_IN addr;
                addr.sin_family = PF_INET;
                addr.sin_port = htons(80);
                addr.sin_addr.s_addr = inet_addr(SVR_IP);
                connect(skt, (SOCKADDR*)&addr, sizeof(addr));
                const char * REQ =
                    "GET " REQ_PATH " HTTP/1.0\r\n"
                    "Host: " SERVER "\r\n"
                    "Accept: */*\r\n"
                    "Connection: close\r\n\r\n";
                send(skt, REQ, strlen(REQ), 0);
                // Associate skt to completion port.
                const DWORD COMPLETION_KEY = 12345;
                CreateIoCompletionPort((HANDLE)skt,
                    hCp, COMPLETION_KEY, 0);
                WSABUF wsaBuf;
                wsaBuf.len = 64 * 1024 - 1;
                wsaBuf.buf = new char[64 * 1024];
                DWORD dwReceived;
                DWORD dwFlags = 0;
                WSAOVERLAPPED overlapped;
                // Start recv.
                ZeroMemory(&overlapped, sizeof(overlapped));
                WSARecv(skt, &wsaBuf, 1,
                        &dwReceived,
                        &dwFlags,
                        &overlapped,
                        NULL);
                // Check the completion port in loop.
                while (true)
                {
                    DWORD dwTransferred;
                    LPOVERLAPPED lpOverlapped;
                    DWORD dwKey;
                    BOOL bRet = GetQueuedCompletionStatus(
                        hCp, &dwTransferred, &dwKey, &lpOverlapped, 1000);
                    if (!bRet) continue;
                    assert(COMPLETION_KEY == dwKey);
                    std::cout << "Transferred: " << dwTransferred << std::endl;
                    assert(dwTransferred <= wsaBuf.len);
                    wsaBuf.buf[50] = '\0';
                    std::cout << "Content: " << wsaBuf.buf << std::endl;
                    // next recv
                    ZeroMemory(&overlapped, sizeof(overlapped));
                    WSARecv(skt, &wsaBuf, 1,
                            &dwReceived,
                            &dwFlags,
                            &overlapped,
                            NULL);
                }
                return 0;
            }
            #include <iostream>
            #include <istream>
            #include <ostream>
            #include <string>
            #include <boost/asio.hpp>
            #include <boost/bind.hpp>
            const std::string SERVER("MyServer");
            const std::string PATH("/jinq/test.zip");
            using boost::asio::ip::tcp;
            class client
            {
            public:
                client(boost::asio::io_service& io_service,
                       const std::string& server, const std::string& path)
                        : socket_(io_service)
                {
                    // Query server and try to connect.
                    tcp::resolver resolver(io_service);
                    tcp::resolver::query query(server, "http");
                    tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
                    tcp::resolver::iterator end;
                    // Try each endpoint until we successfully establish a connection.
                    boost::system::error_code error = boost::asio::error::host_not_found;
                    while (error && endpoint_iterator != end)
                    {
                        socket_.close();
                        socket_.connect(*endpoint_iterator++, error);
                    }
                    if (error)
                        throw boost::system::system_error(error);
                    // Send the request.
                    boost::asio::streambuf request;
                    std::ostream request_stream(&request);
                    request_stream << "GET " << path << " HTTP/1.0\r\n";
                    request_stream << "Host: " << server << "\r\n";
                    request_stream << "Accept: */*\r\n";
                    request_stream << "Connection: close\r\n\r\n";
                    boost::asio::write(socket_, request);
                    // start reading...
                    boost::asio::async_read(socket_, response_,
                        boost::asio::transfer_at_least(1),
                        boost::bind(&client::handle_read_content, this,
                            boost::asio::placeholders::error));
                }
            private:
                void handle_read_content(const boost::system::error_code& err)
                {
                    if (!err)
                    {
                        // Write all of the data that has been read so far.
                        // std::cout << &response_ << "\n";
                        std::cout << "Received: " << response_.size() << std::endl;
                        response_.consume(response_.size());
                        // Continue reading remaining data until EOF.
                        boost::asio::async_read(socket_, response_,
                            boost::asio::transfer_at_least(1),
                            boost::bind(&client::handle_read_content, this,
                                boost::asio::placeholders::error));
                    }
                    else if (err != boost::asio::error::eof)
                    {
                        std::cout << "Error: " << err << "\n";
                    }
                }
                tcp::socket socket_;
                boost::asio::streambuf response_;
            };
            int main(int argc, char* argv[])
            {
                try
                {
                    boost::asio::io_service io_service;
                    client c(io_service, SERVER, PATH);
                    io_service.run();
                }
                catch (std::exception& e)
                {
                    std::cout << "Exception: " << e.what() << "\n";
                }
                return 0;
            }

            posted on 2008-01-29 12:40 深藍(lán)色系統(tǒng) 閱讀(399) 評論(0)  編輯 收藏 引用


            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            導(dǎo)航

            <2009年7月>
            2829301234
            567891011
            12131415161718
            19202122232425
            2627282930311
            2345678

            統(tǒng)計

            常用鏈接

            留言簿(75)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            久久66热人妻偷产精品9| 久久免费视频6| 久久亚洲AV成人无码国产| 久久精品黄AA片一区二区三区| 国色天香久久久久久久小说| 国产亚洲综合久久系列| 久久精品18| 亚洲人成伊人成综合网久久久 | 久久国产一片免费观看| 伊人久久国产免费观看视频| 丁香狠狠色婷婷久久综合| 性做久久久久久久久浪潮| 波多野结衣中文字幕久久| 一本色道久久88综合日韩精品 | 国产精品日韩深夜福利久久| 波多野结衣久久一区二区| 国产精品美女久久久久| 亚洲国产成人久久综合碰| 久久久久国产一级毛片高清版| 性做久久久久久久久久久| 伊人丁香狠狠色综合久久| 亚洲国产精品成人久久| 亚洲美日韩Av中文字幕无码久久久妻妇 | 亚洲国产精品无码久久98| 亚洲?V乱码久久精品蜜桃| 91精品国产综合久久四虎久久无码一级| 亚洲精品NV久久久久久久久久| 色综合合久久天天综合绕视看| 欧美一区二区三区久久综合 | 久久久久久亚洲精品影院| 国产精自产拍久久久久久蜜| 久久伊人精品青青草原高清| 精品久久久噜噜噜久久久| 亚洲精品乱码久久久久久按摩| 人妻丰满?V无码久久不卡| 久久国产精品无码HDAV| 久久久一本精品99久久精品88| 午夜天堂精品久久久久| 乱亲女H秽乱长久久久| 久久青青草原亚洲av无码app| 国产精品99久久99久久久|