2014-12-28 223 views
2

我試圖使用TCP發送和接收來自客戶端和服務器的消息。我正在嘗試使用線程,並且我不知道如何執行此操作。我可以很好地連接到服務器,但我需要能夠根據需要發送和接收來自兩個地方的消息。由於Google上的所有結果都過於複雜和混亂,因此我一直在尋找幾個小時並空洞起來。增強asio發送和接收消息

struct Client 
{ 
boost::asio::ip::tcp::socket socket; 

Client(const char* host = HOST, const char* port = PORT) : socket(io_service) 
{ 
    boost::asio::ip::tcp::resolver resolver(io_service); 
    boost::asio::ip::tcp::resolver::iterator endpoint = resolver.resolve(boost::asio::ip::tcp::resolver::query(HOST, PORT)); 
    boost::asio::connect(this->socket, endpoint); 
    }; 
}; 

這就是我迄今爲止的客戶。

對於服務器:

const int PORT = 52275; 

int main() 
{ 
    try 
{ 
    boost::asio::io_service io_service; 
    boost::asio::ip::tcp::acceptor acceptor(io_service, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), PORT)); 

    { 
     boost::asio::ip::tcp::socket socket(io_service); 
     acceptor.accept(socket); 
     main(); 
    } 
} 
catch (std::exception& e) 
{ 
    std::cerr << "Exception: " << e.what() << std::endl; 
} 
} 
+0

你會在這裏解決的所有結果,你會發現「過度複雜和雜亂」。出於簡單的原因,它們也不一定適合您的參考/代碼上下文框架。主要原因是:你不會分享任何你的上下文代碼。 (現在,你是安全的,因爲**沒有人會花一個小時爲你重新創造這些例子之一,只是因爲你不喜歡現有的樣本,那樣會浪費時間。 _) – sehe

+1

我並不是要求爲我重新創建完整的解釋,而是一個簡單的示例或對通信的解釋。我試着調整我找到的例子,但所有這些都導致了錯誤。我不是C++方面的專家,但我不是很新,我需要爲我做的一切。幾乎沒有記錄提升阿西奧。 –

+0

[真的](http://paste.ubuntu.com/9632633/)?正如你在你的問題中提到的那樣,你要求的東西存在於許多地方。 SO是一個你問具體編程問題的地方。所以,告訴我們你被困在什麼地方。我們不打算google沒有任何上下文的好例子。你可以做得更好。 – sehe

回答

6

因爲它是顯然安全的假設,你只是想發送/任何/消息通過最簡單的方法可能:

Live On Coliru

#include <boost/asio.hpp> 

struct Client 
{ 
    boost::asio::io_service& io_service; 
    boost::asio::ip::tcp::socket socket; 

    Client(boost::asio::io_service& svc, std::string const& host, std::string const& port) 
     : io_service(svc), socket(io_service) 
    { 
     boost::asio::ip::tcp::resolver resolver(io_service); 
     boost::asio::ip::tcp::resolver::iterator endpoint = resolver.resolve(boost::asio::ip::tcp::resolver::query(host, port)); 
     boost::asio::connect(this->socket, endpoint); 
    }; 

    void send(std::string const& message) { 
     socket.send(boost::asio::buffer(message)); 
    } 
}; 


#include <iostream> 

static const int PORT = 52275; 

void client_thread() { 
    boost::asio::io_service svc; 
    Client client(svc, "127.0.0.1", std::to_string(PORT)); 

    client.send("hello world\n"); 
    client.send("bye world\n"); 
} 

void server_thread() { 
    try 
    { 
     boost::asio::io_service io_service; 
     boost::asio::ip::tcp::acceptor acceptor(io_service, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), PORT)); 

     { 
      boost::asio::ip::tcp::socket socket(io_service); 
      acceptor.accept(socket); 

      boost::asio::streambuf sb; 
      boost::system::error_code ec; 
      while (boost::asio::read(socket, sb, ec)) { 
       std::cout << "received: '" << &sb << "'\n"; 

       if (ec) { 
        std::cout << "status: " << ec.message() << "\n"; 
        break; 
       } 
      } 
     } 
    } 
    catch (std::exception& e) 
    { 
     std::cerr << "Exception: " << e.what() << std::endl; 
    } 
} 

#include <boost/thread.hpp> 

int main() { 
    boost::thread_group tg; 
    tg.create_thread(server_thread); 

    boost::this_thread::sleep_for(boost::chrono::milliseconds(100)); 
    tg.create_thread(client_thread); 

    tg.join_all(); 
} 
+0

Now [Live On Coliru](http://coliru.stacked-crooked.com/a/341dcdf4581ea66e) – sehe

+1

謝謝,這正是我所需要的。我唯一遇到的問題是服務器上的接收回調,例如,當服務器收到消息時,它可以將消息打印到控制檯。 –

+0

@TidasBay我相信你。然而,沒有服務器。 – sehe