• <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://www.shnenglu.com/jinq0123/archive/2007/12/24/CompletionPortExamples.html


            試運行asio的async_client例程時,發現CPU占用很高,
            所以又寫了一個相同功能但直接調用完成端口API的代碼,
            進行比較,發現同樣占用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 深藍色系統 閱讀(391) 評論(0)  編輯 收藏 引用

            導航

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

            統計

            常用鏈接

            留言簿(75)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            亚洲国产天堂久久综合| 99久久精品费精品国产一区二区| 国产69精品久久久久99尤物| 久久精品国产亚洲Aⅴ香蕉| 久久夜色精品国产www| 无码人妻久久一区二区三区| 久久香蕉一级毛片| 看全色黄大色大片免费久久久| 久久久久亚洲AV片无码下载蜜桃| 99久久精品影院老鸭窝| 久久久精品波多野结衣| 久久精品国产亚洲AV高清热| 狠狠久久综合伊人不卡| 人妻精品久久久久中文字幕69 | 久久精品国产男包| 精品国产乱码久久久久久郑州公司| 久久天天躁狠狠躁夜夜av浪潮| 嫩草伊人久久精品少妇AV| 久久久久99精品成人片三人毛片| 亚洲精品无码专区久久久| 久久天天躁狠狠躁夜夜不卡 | 无码国内精品久久人妻麻豆按摩| 国产精品无码久久综合| 精品多毛少妇人妻AV免费久久| 66精品综合久久久久久久| 99久久无码一区人妻a黑| 亚洲va中文字幕无码久久| 亚洲综合久久夜AV | 色婷婷久久久SWAG精品| 激情五月综合综合久久69| 久久久久久久综合日本亚洲| 欧美噜噜久久久XXX| 性欧美丰满熟妇XXXX性久久久| 亚洲国产香蕉人人爽成AV片久久| 999久久久免费国产精品播放| 99久久精品费精品国产一区二区 | 狠狠色丁香久久婷婷综合蜜芽五月 | 狠狠久久综合| 日本精品久久久久影院日本| 久久夜色精品国产www| 中文字幕无码av激情不卡久久|