• <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的代碼,
            進行比較,發(fā)現(xiàn)同樣占用CPU。
            與flashget比較,下載速度差不多,但flashget不占CPU。
            將直接API調(diào)用代碼和利用asio的代碼都列在下面。
            進行測試時,要將其中的參數(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 深藍色系統(tǒng) 閱讀(392) 評論(0)  編輯 收藏 引用

            導航

            <2008年11月>
            2627282930311
            2345678
            9101112131415
            16171819202122
            23242526272829
            30123456

            統(tǒng)計

            常用鏈接

            留言簿(75)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            久久国产成人精品麻豆| 久久久久国产亚洲AV麻豆| 久久精品蜜芽亚洲国产AV| 国产精品久久久久9999高清| 久久99热这里只有精品国产| 亚洲?V乱码久久精品蜜桃| 麻豆亚洲AV永久无码精品久久| 中文字幕亚洲综合久久2| 久久天天躁狠狠躁夜夜2020一| 久久se精品一区精品二区| 久久中文字幕人妻丝袜| 老司机国内精品久久久久| 国产69精品久久久久观看软件| 久久精品一区二区国产| 伊人久久大香线蕉av不卡| 久久中文娱乐网| 久久天堂AV综合合色蜜桃网| 亚洲国产成人乱码精品女人久久久不卡| 久久精品水蜜桃av综合天堂| 免费无码国产欧美久久18| 久久久久噜噜噜亚洲熟女综合| 成人综合伊人五月婷久久| 久久香蕉超碰97国产精品| 久久香综合精品久久伊人| 一本色综合久久| 亚洲AⅤ优女AV综合久久久| 精品视频久久久久| 2020最新久久久视精品爱| 精品熟女少妇a∨免费久久| 一本久久a久久精品亚洲| 超级97碰碰碰碰久久久久最新| 日韩美女18网站久久精品| 国产亚洲精久久久久久无码AV| 久久精品国产免费一区| 午夜不卡888久久| 久久国产精品偷99| 久久精品国产一区二区| 久久强奷乱码老熟女网站| 亚洲国产精品一区二区三区久久 | 香蕉aa三级久久毛片| 久久综合亚洲色HEZYO国产|