好的,此代码处理服务器和客户端之间的服务器端通信。我对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));
}
我希望能够将“hello world”写入客户端然后读入客户端所说的内容,但是如果我async_write
(已注释掉),则会断开客户端和{{ 1}}因为没有连接而吐出错误
TLDR 如何保持连接打开,或者我不认为
答案 0 :(得分: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));
}
该功能按照我的意愿工作,至少在某种程度上如此。我必须编写的客户端每次想要询问服务器时都必须创建一个新连接。