2016-06-19 4 views
0

Хорошо, этот код обрабатывает связь на стороне сервера между сервером и клиентом. Я не слишком хорошо знаком с 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, как сделать так, чтобы открыть соединение, или я не думаю, что до

+0

Вы используете telnet для общения с сервером? Использование «шпатлевки» для меня непонятно? Кроме того, «Сервер получает данные только тогда, когда клиент закрывает его соединение». Я думаю, здесь вы обрабатываете дескриптор 'async_read' с 0 байтами для чтения, в этом случае сервер получил пакет« RST »от клиента, указывающий на закрытие подключение. – Arunmu

ответ

1

Я исправил свою проблему, изначально я хотел, чтобы клиент отправлял информацию на сервер, а затем сервер отвечал. Я понял, как это сделать. @Arunmu помог мне понять, что PuTTY вызывает некоторые проблемы из-за того, что, когда он указал на это, я глубже погрузился в это.

Оказалось, что PuTTY закрывает окно и не отображает сообщения на стороне сервера, так как считается успешным. Единственное, что мне пришлось изменить, это последняя функция, которую я опубликовал.

void Connection::start() { 
    boost::asio::async_read_until(socket_, msg, "\n", 
    boost::bind(&Connection::handle_read, shared_from_this(), 
    boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); 

}

Функция работает, как я хочу, чтобы он, по крайней мере, до некоторой степени. Клиенту, которого я должен написать, просто нужно будет создать новое соединение каждый раз, когда он захочет спросить у сервера что-то.

Смежные вопросы