2016-04-30 12 views
1

私はboostライブラリを使ってtcp-serverを作成しようとしました。私は基本的にブーストからサンプルコードを取り出し(コード全体が1つのファイルにあります)、クラスに分割しました。C++ boost tcp-server

何かが間違っているように見えて、私は本当に何が欠けているのかわかりません。

"tcp_server.cpp"の最後にエラーがあります。エラーメッセージをそこにコメントに入れます。彼は関数のセッション(私はそれをどのように解釈するか)を知っていないように見えますが、 "tcp_server :: session"と "this-> session"で同じエラーが発生します。

2番目の問題は、「e.what()」(identiferを解決できないもの)からのエラーです。これは、サンプルコードで動作し、私は例外で何も変更しませんでした。

ありがとうございます。

tcp_server.h

#include <cstdlib> 
#include <iostream> 
#include <exception> 
#include <boost/bind.hpp> 
#include <boost/smart_ptr.hpp> 
#include <boost/asio.hpp> 
#include <boost/thread/thread.hpp> 

using boost::asio::ip::tcp; 

class tcp_server 
{ 
public: 
typedef boost::shared_ptr<tcp::socket> socket_ptr; 

tcp_server(); 
~tcp_server(); 

void server(boost::asio::io_service&); 

private: 

const short port = 8888; 
const int max_length = 1024; 

void session(socket_ptr); 

}; 

tcp_server.cpp

#include "tcp_server.h" 


tcp_server::tcp_server() 
{ 

} 

tcp_server::~tcp_server() 
{ 

} 


void tcp_server::session(socket_ptr sock) 
{ 
try 
    { 
    for (;;) 
    { 
     char data[max_length]; 

     boost::system::error_code error; 
     size_t length = sock->read_some(boost::asio::buffer(data), error); 


     if (error == boost::asio::error::eof) 
     break; // Connection closed cleanly by peer. 
     else if (error) 
     throw boost::system::system_error(error); // Some other error. 

     boost::asio::write(*sock, boost::asio::buffer(data, length)); 
    } 
    } 
    catch (std::exception& e) 
    { 
    std::cerr << "Exception in thread: " << e.what() << "\n"; // 
    } 
} 


void tcp_server::server(boost::asio::io_service& io_service) 
{ 
    tcp::acceptor a(io_service, tcp::endpoint(tcp::v4(), port)); 
    for (;;) 
    { 
    socket_ptr sock(new tcp::socket(io_service)); 
    a.accept(*sock); 
    boost::thread t(boost::bind(session, sock)); //error: no matching function for call to ‘bind(<unresolved overloaded function type>, tcp_server::socket_ptr&)’` 
    } 
} 

main.cppに

#include "tcp_server.h" 


int main() { 

    tcp_server server; 

    try 
    { 
    boost::asio::io_service io_service; 

    server.server(io_service); 
    } 
    catch (std::exception& e) 
    { 
    std::cerr << "Exception: " << e.what() << "\n"; 
    } 

    return 0; 
} 

答えて

1

あなたはできませんbind非静的メンバ関数tcp_server::sessionそれはなしで呼び出すことはできませんので、バインドで使用できないオブジェクト・インスタンス。

ます。ただし、この修正する(tcp_header.h中)tcp_server::session静的を行うことができます。

static void session(socket_ptr); 

編集:

あなたが使用して非静的メンバーとしてセッションをバインドすることができます。

boost::thread t(boost::bind(&tcp_server::session, this, sock)); 
+0

をありがとう、それは今働く:) – Soody

関連する問題