Boost Asio Klassenmethode Übergabe Problem
-
Hi,
ich will das Beispiel für Netzwerkprogrammierung http://www.highscore.de/cpp/boost/asio.html#netzwerkprogrammierung als eine Klasse realisieren.
Dazu habe ich folgende Header Datei
#ifndef SERVER_H_ #define SERVER_H_ #include <boost/asio.hpp> #include <string> class Server { private: boost::asio::ip::tcp::acceptor acceptor(boost::asio::io_service io_service, boost::asio::ip::tcp::endpoint endpoint); boost::asio::ip::tcp::socket sock(boost::asio::io_service io_service); public: Server(); virtual ~Server(); void start(); void write_handler(const boost::system::error_code &ec, std::size_t bytes_transferred); void accept_handler(const boost::system::error_code &ec); }; #endif /*SERVER_H_*/
und die zugehörige cpp datei
#include "Server.h" Server::Server() { Server::start(); } Server::~Server() { } void Server::write_handler(const boost::system::error_code &ec, std::size_t bytes_transferred) { } void Server::accept_handler(const boost::system::error_code &ec) { if (!ec) { std::string data = "Antwort"; boost::asio::async_write(sock, boost::asio::buffer(data), &Server::write_handler); } } void Server::start() { boost::asio::io_service io_service; boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::tcp::v4(), 1234); boost::asio::ip::tcp::acceptor acceptor(io_service, endpoint); boost::asio::ip::tcp::socket sock(io_service); acceptor.listen(); acceptor.async_accept(sock, Server::accept_handler); io_service.run(); }
Auszug aus Fehler
./src/Server.cpp: In member function ‘void Server::accept_handler(const boost::system::error_code&)’:
../src/Server.cpp:21: error: invalid initialization of reference of type ‘boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_serviceboost::asio::ip::tcp > (Server::&)(boost::asio::io_service)’ from expression of type ‘<unresolved overloaded function type>’
../lib/boost/asio/impl/write.ipp:211: error: in passing argument 1 of ‘void boost::asio::async_write(AsyncWriteStream&, const ConstBufferSequence&, WriteHandler) [with AsyncWriteStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_serviceboost::asio::ip::tcp > (Server::)(boost::asio::io_service), ConstBufferSequence = boost::asio::const_buffers_1, WriteHandler = void (Server::*)(const boost::system::error_code&, size_t)]’
../src/Server.cpp: In member function ‘void Server::start()’:
../src/Server.cpp:32: error: no matching function for call to ‘boost::asio::basic_socket_acceptor<boost::asio::ip::tcp, boost::asio::socket_acceptor_serviceboost::asio::ip::tcp >::async_accept(boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_serviceboost::asio::ip::tcp >&, <unresolved overloaded function type>)’Das Problem besteht bei den Handler Methoden weil sie Klassemethoden definiert sind, stehen sie alleine funktioniert es. Wie übergebe ich die Methodenamen richtig in den async_write (Zeile 21) und async_accept (Zeile 32) Methoden?
Gruss,
vol
-
vol schrieb:
...
Du musst Dir dafür Funktionsobjekte mit boost.bind erzeugen, und diese dann die Memberfunktion an Instanzen binden (in diesem Fall an this).
Guck Dir mal die Tutorials und Beispiele aus der boost.asio Dokumentation an. Da wird das überall gemacht.