搜尋

首頁  >  問答  >  主體

c++ - boost的read函数参数和bind函数参数看不懂

/* 这是一个同步的echo客户端 
 * 在sync_echo()函数中的read函数的第三个参数中,bind有两个占位符号,
 * 调用read_complete()函数,可是在read_complete()函数中,需要用到bytes这个参数
 * 我想请问这个bytes是怎么传进去的?
*/
#include <iostream>
#include <boost/thread.hpp>
#include <boost/bind.hpp>
#include <boost/asio.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/enable_shared_from_this.hpp>

using namespace boost::asio;
using boost::system::error_code;

io_service service;

size_t read_complete(char *buf, const error_code &err, size_t bytes)
{
    if (err)
        return 0;
    bool found = std::find(buf, buf+bytes, '\n') < buf + bytes;
    // we read one-by-one until we get to enter, no buffering
    return found? 0: 1;
}

ip::tcp::endpoint ep(ip::address::from_string("127.0.0.1"), 8001);

void sync_echo(std::string msg)
{
    msg += "\n";
    ip::tcp::socket sock(service);
    sock.connect(ep);
    sock.write_some(buffer(msg));
    char buf[1024];
    int bytes = read(sock, buffer(buf), boost::bind(read_complete, buf, _1, _2));
    std::string copy(buf, bytes - 1);
    msg = msg.substr(0, msg.size() - 1);
    std::cout << "server echoed our " << msg << ": "
        << (copy == msg? "OK": "FAIL") << std::endl;
    sock.close();
}

int main(int argc, char *argv[])
{
    // connect several clients
    char *messages[] = {"John says hi", 
    "so does James", "Lucy just not home",
    "Boost.Asio is fun!", 0 };
    boost::thread_group threads;
    for (char **message = messages; *message; ++ message)
    {
        threads.create_thread(boost::bind(sync_echo, *message));
        boost::this_thread::sleep(boost::posix_time::millisec(100));
    }
    threads.join_all();
}
PHP中文网PHP中文网2806 天前631

全部回覆(2)我來回復

  • 天蓬老师

    天蓬老师2017-04-17 13:09:24

    第一次看到,確實有點驚艷到。
    搬運,連結:http://zh.highscore.de/cpp/boost/functionobjects.html
    關鍵摘抄:_1 稱為佔位符(placeholder),定義於 Boost.Bind。 除了 _1,Boost.Bind 還定義了 _2 和 _3。 透過使用這些佔位符,boost::bind() 可以變成一元、二元或三元的函數。
    個人理解:
    就是說,read函數要求的第三個參數本身就是個有2個參數的函數。然後針對你的問題,對於read_complete的三個參數:read函數傳入的const error_code &err, size_t bytes,你傳入的是buf
    如果可以的話,你看read函數原始碼的執行流程證實一下就知道了。

    回覆
    0
  • 阿神

    阿神2017-04-17 13:09:24

    問:

    我想請問這個bytes是怎麼傳進去的?

    答:這裡:int bytes = read(sock, buffer(buf), boost::bind(read_complete, buf, _1, _2));

    read_complete有三個參數,bind的意思是說,第一個參數是buf,第二個參數是傳回的function的第一個參數,第三個參數是傳回的function的第二個參數。如果你把_1和_2換過來,那麼你在呼叫回傳的function的時候參數也要換過來。

    使用現代C++的寫法如下:
    舊:

    boost::bind(read_complete,b uf, _1, _2)
    

    新:

    [&buf](auto a, auto b)
    {
        return read_complete(buf, a, b);
    }

    回覆
    0
  • 取消回覆