2017-01-04 4 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 в обработчиках чтения. Асинхронные серверы asio будут обслуживать несколько клиентов до тех пор, пока потоки службы продолжат работать с назначенной задачей async_accept.

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