3

Boost:asio ライブラリを使用してネットワーク プログラミングを行うことで、自分のやり方を感じようとしています。特定のアドレスからデータを転送するために非同期ハンドラーを使用してきましたが、asio を関数として利用すると正常に動作します。

boost::asio::io_service io_service;
boost::asio::ip::tcp::resolver resolver( io_service);
boost::asio::ip::tcp::socket sock( io_service);
boost::array < char, 4096 > buffer;

void read_handler( const boost:: system:: error_code &ec,
        std:: size_t bytes_transferred)
{
    if (! ec)
        {
            if (std::string(buffer.data(), bytes_transferred) == "$")
            {
                    myss.str(std::string());
            }
            myss << std::string(buffer.data(), bytes_transferred);
            if (int(buffer.data()[0]) == 10)
                {
                    ....

                }
            std::cout << std::string(buffer.data(), bytes_transferred) ;//<< std::endl;
            sock.async_read_some( boost::asio::buffer( buffer), read_handler);
        }
}

void connect_handler( const boost::system::error_code &ec)
{
    if (! ec)
        {
            boost::asio::write( sock, boost::asio::buffer(
                    "GET / HTTP 1.1\r\nHost: www.google.com\r\n\r\n"));
            sock.async_read_some( boost::asio::buffer( buffer), read_handler);
        }
}

void resolve_handler( const boost::system::error_code &ec,
        boost:: asio::ip::tcp::resolver::iterator it)
{
    if (! ec)
        {
            sock.async_connect(* it, connect_handler);
        }
}

今、これらの関数をクラスに統合しようとしていますが、Visual Studio は、関数をクラスに実装する方法について不平を言い続けています。

void
MyClass::connect_handler( const boost::system::error_code &ec)
{
    if (! ec)
        {
            //boost::asio::write( sock, boost::asio::buffer(
            //        "GET / HTTP 1.1\r\nHost: www.highscore.de\r\n\r\n"));
            m_sock.async_read_some( boost::asio::buffer( m_buffer), read_handler);
        }
}

    : error C3867: 'MyClass::read_handler': function call missing argument list; use '&MyClass::read_handler' to create a pointer to member: 
    error C3867: 'MyClass::read_handler': function call missing argument list; use '&MyClass::read_handler' to create a pointer to member
    2>'MyClass::connect_handler': function call missing argument list; use 

'&MyClass::connect_handler' to create a pointer to member
2>
2>Build FAILED.

これらをクラスに移動する際に私が間違っていることについて、誰かが何かポインタを持っていますか?

エラー メッセージで推奨される変更を実装しようとしましたが、boost ライブラリ自体でエラーが発生します。

2>C:\installs\Boost\include\boost-1_49\boost/asio/basic_stream_socket.hpp(785): error C2338: ReadHandler type requirements not met
2>          : see reference to function template instantiation 'void boost::asio::basic_stream_socket<Protocol>::async_read_some<boost::asio::mutable_buffers_1,void(__thiscall MyClass::Sensor::* )(const boost::system::error_code &,size_t)>(const MutableBufferSequence &,const ReadHandler &)' being compiled
2>          with
2>          [
2>              Protocol=boost::asio::ip::tcp,
2>              MutableBufferSequence=boost::asio::mutable_buffers_1,
2>              ReadHandler=void (__thiscall MyClass::Sensor::* )(const boost::system::error_code &,size_t)
2>          ]
2>C:\installs\Boost\include\boost-1_49\boost/asio/basic_stream_socket.hpp(785): error C2064: term does not evaluate to a function taking 2 arguments
2>C:\installs\Boost\include\boost-1_49\boost/asio/basic_socket.hpp(706): error C2338: ConnectHandler type requirements not met
2>           : see reference to function template instantiation 'void boost::asio::basic_socket<Protocol,SocketService>::async_connect<void(__thiscall MyClass::Sensor::* )(const boost::system::error_code &)>(const boost::asio::ip::basic_endpoint<InternetProtocol> &,const ConnectHandler &)' being compiled
2>          with
2>          [
2>              Protocol=boost::asio::ip::tcp,
2>              SocketService=boost::asio::stream_socket_service<boost::asio::ip::tcp>,
2>              InternetProtocol=boost::asio::ip::tcp,
2>              ConnectHandler=void (__thiscall MyClass::Sensor::* )(const boost::system::error_code &)
2>          ]
2>C:\installs\Boost\include\boost-1_49\boost/asio/basic_socket.hpp(706): error C2064: term does not evaluate to a function taking 1 arguments
2>
4

2 に答える 2

5

m_sock.async_read_some(boost :: asio :: buffer(m_buffer)、read_handler);

2つの引数を受け入れるメンバー関数であるとするread_handlerと、次のようになります。m_sock.async_read_some(boost::asio::buffer( m_buffer), boost::bind(&MyClass::read_handler, this, _1, _2));

shared_from_thisイディオムを使用する場合(つまり、クラスがから継承するenable_shared_from_this場合)、式shared_from_this()の代わりにを使用thisbindます。

于 2012-10-17T21:26:06.687 に答える
1

メンバーに名前を付けるだけではメンバーへのポインターを作成できません。クラス資格を使用して明示的に要求する必要があります。

&MyClass::connect_handler

(エラーメッセージが非常に明確に述べているように...)

于 2012-10-17T17:49:08.857 に答える