• <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>

            我的玻璃盒子

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

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


            試運行asio的async_client例程時,發(fā)現CPU占用很高,
            所以又寫了一個相同功能但直接調用完成端口API的代碼,
            進行比較,發(fā)現同樣占用CPU。
            與flashget比較,下載速度差不多,但flashget不占CPU。
            將直接API調用代碼和利用asio的代碼都列在下面。
            進行測試時,要將其中的參數定義改改,如SERVER參數。
            并且要找個大文件下載才有明顯結果。
            #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 深藍色系統(tǒng) 閱讀(392) 評論(0)  編輯 收藏 引用

            導航

            <2025年6月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

            統(tǒng)計

            常用鏈接

            留言簿(75)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            久久精品国产亚洲AV不卡| 成人精品一区二区久久久| 亚洲va久久久噜噜噜久久| 久久久久久伊人高潮影院| 少妇久久久久久久久久| 久久99国产精品久久99果冻传媒| 久久99热精品| 99久久国产精品免费一区二区| 国产精品欧美久久久天天影视 | 久久久久九国产精品| 久久99热精品| 久久亚洲AV成人无码电影| 精品无码人妻久久久久久| 久久久久久国产精品无码超碰| 欧美激情精品久久久久久久九九九| 99久久精品国产麻豆| 久久国产精品成人片免费| 色偷偷偷久久伊人大杳蕉| 亚洲国产另类久久久精品黑人| 亚洲国产精品无码久久久久久曰| 亚洲国产视频久久| 久久婷婷国产剧情内射白浆| 久久久久亚洲?V成人无码| 色99久久久久高潮综合影院| 久久久亚洲裙底偷窥综合| 老色鬼久久亚洲AV综合| jizzjizz国产精品久久| 久久久久国产精品三级网| 久久久一本精品99久久精品66| 国产三级久久久精品麻豆三级 | 精品乱码久久久久久夜夜嗨| 久久精品免费网站网| 亚洲精品久久久www| 伊人久久大香线蕉成人| 久久久久久久人妻无码中文字幕爆| 99久久亚洲综合精品网站| 深夜久久AAAAA级毛片免费看| 亚洲av成人无码久久精品| 久久久精品国产亚洲成人满18免费网站| 亚洲综合久久夜AV | 国产精品久久国产精品99盘|