• <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 深藍色系統 閱讀(394) 評論(0)  編輯 收藏 引用

            導航

            <2008年1月>
            303112345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

            統計

            常用鏈接

            留言簿(75)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            国产免费久久精品丫丫| 日韩人妻无码精品久久久不卡| 7777久久亚洲中文字幕| 国产精品久久国产精品99盘| 久久综合欧美成人| 久久久久人妻一区二区三区| 日日噜噜夜夜狠狠久久丁香五月| 久久线看观看精品香蕉国产| 亚洲AV伊人久久青青草原| 久久超乳爆乳中文字幕| 久久综合给合综合久久| 7777久久亚洲中文字幕| 少妇熟女久久综合网色欲| 久久久精品午夜免费不卡| 少妇熟女久久综合网色欲| 日本久久久久久中文字幕| 伊人久久大香线蕉综合热线| 久久国产成人精品麻豆| 久久久亚洲AV波多野结衣| 99久久99久久精品国产片| 久久人爽人人爽人人片AV| 四虎影视久久久免费| 日本一区精品久久久久影院| 麻豆亚洲AV永久无码精品久久| 日本精品一区二区久久久| 亚洲国产精品久久66| 久久国产精品成人免费| 久久99精品国产自在现线小黄鸭| 免费精品国产日韩热久久| 久久久久久国产精品无码下载| 97精品伊人久久久大香线蕉| 精品久久久久久国产潘金莲| 亚洲狠狠婷婷综合久久蜜芽| 狠狠色综合网站久久久久久久高清| 久久久久久A亚洲欧洲AV冫 | 久久午夜无码鲁丝片秋霞| 久久久久九国产精品| 亚洲欧洲久久av| 亚洲综合精品香蕉久久网| 久久香综合精品久久伊人| 狠狠色丁香久久婷婷综合|