2017-01-04 90 views
2

我已經編寫了一個客戶端和服務器程序。該程序當前執行以下操作:C++ - Boost ASIO網絡服務器/客戶端

  1. 服務器偵聽到終點爲
  2. 客戶端連接到
  3. 服務器上接受
  4. 客戶端接收消息
一個連接發送消息到服務器的連接

我這樣做是異步的。但是,問題是他們只能發送/接收一條消息。之後,他們只是終止。下面是我的代碼:

#include <iostream> 
#include <vector> 
#include<boost/asio.hpp> 

std::vector<char> buff(256); 

void SendHandler(boost::system::error_code ex){ 
    std::cout << " do something here" << std::endl; 
} 

void ReadHandler(boost::system::error_code ex){ 
    std::cout << " print the buffer data..." << std::endl; 
    std::cout << buff.data() << std::endl; 

} 

void Server(){ 
    boost::asio::io_service service; 
    using namespace boost::asio::ip; 
    tcp::endpoint endpoint(tcp::v4(), 4000); 
    tcp::acceptor acceptor(service, endpoint); 
    tcp::socket socket(service); 
    std::cout << "[Server] Waiting for connection" << std::endl; 


    acceptor.accept(socket); 
    std::cout << "[Server] Accepted a connection from client" << std::endl; 

    std::string msg = "Message from server"; 
    socket.async_send(boost::asio::buffer(msg), SendHandler); 
    service.run(); 

} 

void Client(){ 
    boost::asio::io_service service; 
    using namespace boost::asio::ip; 
    tcp::endpoint endpoint(address::from_string("127.0.0.1"), 4000); 
    tcp::socket socket(service); 
    std::cout << "[Client] Connecting to server..." << std::endl; 
    socket.connect(endpoint); 
    std::cout << "[Client] Connection successful" << std::endl; 

    socket.async_read_some(boost::asio::buffer(buff), ReadHandler); 
    service.run(); 
} 

int main(int argc, char **argv) { 
    if(argc == 1){ 
     std::cout << "Please specify s for server or c for client" << std::endl; 
     return -1; 
    } 
    if(argv[1][0] == 's'){ 
     Server(); 
    } 
    else{ 
     Client(); 
    } 
    return 0; 
} 

我想這個擴展程序,以便:

  1. 服務器可以偵聽和客戶端可以無限期地發送請求。更像是單向聊天系統。
  2. 服務器能夠連接到多個客戶端。

async_send()service.run()置於無限循環中並沒有幫助。它只是在客戶端反覆打印消息,直到客戶端終止。

我是boost::asio甚至network programming相當新。請告訴我在我的代碼中應該修改哪些內容和哪些內容?

回答

2

從學習一些基礎知識開始。圖書館提供了很多精彩的教程和示例,它們將引導您瞭解同步服務器和異步服務器的概念和示例。

http://www.boost.org/doc/libs/1_62_0/doc/html/boost_asio.html

從頭開始。通過計時器和回調來了解基本概念。繼續教程進入網絡。通過編輯教程程序,在您幾個小時的過程中建立核心思想,以自行嘗試創意。

然後按照示例部分進行操作。 '聊天'的例子非常接近你想要建立的。這個特定的例子展示瞭如何通過在讀處理程序中重新發布async_reads來打開連接。只要服務線程繼續使用分配的async_accept任務運行,異步asio服務器就會爲多個客戶端提供服務。

http://www.boost.org/doc/libs/1_62_0/doc/html/boost_asio/examples/cpp11_examples.html http://www.boost.org/doc/libs/1_62_0/doc/html/boost_asio/example/cpp11/chat/chat_server.cpp