Я написал программу для клиента и сервера. В настоящее время программа выполняет следующие действия:C++ - Boost Сетевой сервер/клиент ASIO
- Сервер прослушивает к конечной точке для подключения
- клиент подключается к серверу
- сервер посылает сообщение о принятии соединения
- клиент получает сообщение
Я делаю это асинхронно. Но проблема в том, что они могут отправлять или получать только одно сообщение. После этого они просто заканчиваются. Ниже мой код:
#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;
}
Я хочу масштабировать эту программу так, чтобы:
- сервер может слушать и клиент может отправить запрос на неопределенный срок. Больше похоже на однопользовательскую чат-систему.
- сервер может подключаться к нескольким клиентам.
Помещение async_send()
и service.run()
в бесконечном цикле не помогло. Он просто печатает сообщение снова и снова на стороне клиента, пока клиент не завершит работу.
Я довольно новичок в boost::asio
даже до network programming
. Скажите, пожалуйста, где и что я должен изменить в своем коде?