Хорошо, этот код обрабатывает связь на стороне сервера между сервером и клиентом. Я не слишком хорошо знаком с boost :: asio, но я старался изо всех сил следовать нескольким учебным пособиям. Тем не менее, остается одна проблема при попытке установить связь между моим клиентом (я еще не построил его, поэтому я использую putty) и сервер. Сервер получает данные только тогда, когда клиент закрывает соединение. Мне просто интересно, если это так, и если да, то как я реагирую на запросы на стороне клиента?Как асинхронно общаться между сервером и клиентом
Это функция для запуска сервера (он укорачивается, я извлекал обработки механизм ошибки)
void Initialize(){
boost::asio::io_service ioservice;
Network network(ioservice);
ioservice.run();
}
Вот функция, которая начинает принимать соединения
void Network::StartAccept(){
Connection::pointer new_connection = Connection::create(acceptor_.get_io_service());
acceptor_.async_accept(new_connection->getSocket(),
boost::bind(&Network::HandleAccept, this,
new_connection, boost::asio::placeholders::error));
}
Эта функция обрабатывает принять и начать повторное прием повторно
void Network::HandleAccept(Connection::pointer new_connection, const boost::system::error_code & error){
if (!error)
{
//sio::cout() is one of my functions that automatically time stamps everything and ends the line if needed
sio::cout("Client Connected from Origin: ", false);
sio::cout(new_connection->getSocket().remote_endpoint().address().to_string(), true, false);
new_connection->start();
}
else {
sio::cout("Could Not Accept Connection to Client");
}
StartAccept();
}
Эта функция обрабатывает клиентский I/O
void Connection::start() {
//message_ = "Hello World";
//boost::asio::async_write(socket_, boost::asio::buffer(message_), boost::bind(&Connection::handle_write, shared_from_this(), boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
boost::asio::async_read(socket_, msg, boost::bind(&Connection::handle_read, shared_from_this(), boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
}
Я хотел бы быть в состоянии написать «привет мир» для клиента, а затем читать, что говорит клиент, тем не менее, если я делать async_write
(который закомментирована), он отключает клиента и async_read
выплевывает ошибку, потому что нет никакой связи
TLDR, как сделать так, чтобы открыть соединение, или я не думаю, что до
Вы используете telnet для общения с сервером? Использование «шпатлевки» для меня непонятно? Кроме того, «Сервер получает данные только тогда, когда клиент закрывает его соединение». Я думаю, здесь вы обрабатываете дескриптор 'async_read' с 0 байтами для чтения, в этом случае сервер получил пакет« RST »от клиента, указывающий на закрытие подключение. – Arunmu