2016-04-30 74 views
1

我試圖用boost庫創建一個tcp-server。我基本上從boost中獲取示例代碼(整個代碼在1個文件中)並將其分成一個類。C++ boost tcp-server

似乎有什麼地方出錯了,我真的不知道什麼是缺失。

主要的錯誤是在「tcp_server.cpp」的末尾,我把錯誤信息放到註釋裏面。看起來他不知道函數會話(至少這是我如何解釋它),我得到了與「tcp_server :: session」和「this-> session」相同的錯誤。

第二件事是我從「e.what()」(無法解析標識符)得到的錯誤。它在示例代碼中工作,在例外情況下我沒有改變任何東西。

在此先感謝。

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_server::session靜態(tcp_header.h)來解決這個問題:

static void session(socket_ptr); 

編輯:

可以使用綁定會話作爲非靜態成員:

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

謝謝,它現在正常工作:) – Soody