サーバーに接続するクライアントをクラスなしで単一のファイルにコーディングしました。これは明らかに良いプログラミング方法ではないため、コードが最終的に希望どおりに動作したとき、次の client.h を使用して myclient クラスを作成しました。
#include <boost/asio.hpp>
#include <boost/array.hpp>
#include <iostream>
#include <string>
#include "mtbf.h"
#include <boost/date_time/posix_time/posix_time.hpp>
class myclient
{
public:
boost::asio::io_service io_service;
boost::asio::ip::tcp::resolver resolver;
boost::asio::ip::tcp::socket sock;
boost::array<char, 4096> buffer;
typedef boost::posix_time::time_duration duration_t;
typedef boost::posix_time::ptime timestamp_t;
std::vector<std::string> tokens;
boost::system::error_code m_err_feedback;
enum ConnectionState
{
WAIT_FOR_HEADER,
WAIT_FOR_DATA,
PACKET_COMPLETE
};
myclient(std::string port);
private:
void read_handler(const boost::system::error_code &ec, std::size_t bytes_transferred);
void connect_handler(const boost::system::error_code &ec);
void resolve_handler(const boost::system::error_code &ec, boost::asio::ip::tcp::resolver::iterator it);
};
client.cpp の完全なコードは書きませんが、ここでエラーが発生します (コンストラクター)
myclient::myclient(std::string port):resolver(io_service),sock(io_service)
{
tcp::resolver::query query("127.0.0.1", port);
resolver.async_resolve(query, boost::bind(&myclient::resolve_handler, this));
io_service.run();
}
私はC ++にかなり慣れていませんが、メンバー関数の参照を呼び出すためにboost::bindが必要であることがわかりました
resolver.async_resolve(query, boost::bind(&myclient::resolve_handler, this));
しかし、どういうわけかこれは正しくありません..エラーが発生します:
error 8 error C2298: 'return': Invalid procedure for an expression with pointer to memberfunction C:\projekte\libs\boost_1_53_0-VC11\boost\bind\mem_fn.hpp 342 1 client
編集:返信ありがとうございます..しかし、さらにエラーが発生しているようです。些細なことを見逃していますか?ここにclient.cppのコードがあります(重要ではないため、read_handlerの実際のアルゴリズムを削除しました)
#include "client.h"
using boost::asio::ip::tcp;
myclient::myclient(std::string port):resolver(io_service),sock(io_service)
{
tcp::resolver::query query("127.0.0.1", port);
resolver.async_resolve(query, boost::bind(&myclient::resolve_handler, this,boost::asio::placeholders::error,boost::asio::placeholders::iterator));
io_service.run();
}
void myclient::read_handler(const boost::system::error_code &ec, std::size_t bytes_transferred)
{
.
.
.
}
void myclient::connect_handler(const boost::system::error_code &ec)
{
if (!ec)
{
sock.async_read_some(boost::asio::buffer(buffer), boost::bind(&myclient::read_handler, this,&ec));
}
}
void myclient::resolve_handler(const boost::system::error_code &ec, boost::asio::ip::tcp::resolver::iterator it)
{
if (!ec)
{
sock.async_connect(*it, boost::bind(&myclient::connect_handler, this, &ec, it));
}
}
これで次のようなエラーが発生します:
error 2 error C2825: "F": must be a class or namespace "::". C:\projekte\libs\boost_1_53_0-VC11\boost\bind\bind.hpp 69 1 client
error 3 error C2039: 'result_type': is not an element of '`global namespace'' C:\projekte\libs\boost_1_53_0-VC11\boost\bind\bind.hpp 69 1 client