2014-12-28 189 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