【发布时间】:2011-05-26 19:05:34
【问题描述】:
我遇到了一个非常特殊的问题。我编写了一个服务器,它将从第三方接收到的数据写入连接的客户端。服务器在一段时间内可以正常写入客户端,但一段时间后,async_write 要么失败,要么写入永远不会返回。对于我的程序,如果 async_write 永远不会返回,则不会发生后续写入,并且我的服务器将从第三方接收的数据排队,直到一切崩溃。
我在下面包含了我的代码:
void ClientPartitionServer::HandleSignal(const CommonSessionMessage& message, int transferSize) {
boost::lock_guard<boost::mutex> lock(m_mutex);
if(m_clientSockets.size() != 0) {
TransferToQueueBuffer(message.GetData(), transferSize);
}
if(m_writeCompleteFlag) {
// TransferToWriteBuffer();
for(vector<boost::asio::ip::tcp::socket*>::const_iterator i = m_clientSockets.begin(); i != m_clientSockets.end(); ++i) {
WriteToClient(*i);
}
}
}
void ClientPartitionServer::WriteToClient(boost::asio::ip::tcp::socket* clientSocket) {
m_writeCompleteFlag = false;
cout << "Iniating write: " << m_identifier << endl;
boost::asio::async_write(
*clientSocket,
boost::asio::buffer(m_queueBuffer.get(), m_queueBufferSize),
boost::bind(
&ClientPartitionServer::HandleWrite, this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred
));
}
void ClientPartitionServer::HandleWrite(const boost::system::error_code& ec, size_t bytes_transferred) {
boost::lock_guard<boost::mutex> lock(m_mutex);
if(ec != 0) {
cerr << "Error writing to client: " << ec.message() << " " << m_identifier << endl;
// return;
cout << "HandleWrite Error" << endl;
exit(0);
}
cout << "Write complete: " << m_identifier << endl;
m_writeCompleteFlag = true;
m_queueBuffer.reset();
m_queueBufferSize = 0;
}
任何帮助将不胜感激。
谢谢。
【问题讨论】:
-
具有异步 I/O 的互斥锁是 NO NO
-
改用 ASIO 链。有关示例和详细信息,请参阅 boost.org/doc/libs/1_46_1/doc/html/boost_asio/tutorial/…。
-
如果您确定 async_write 永远不会返回,那么这是 asio 中的一个错误,因为 async_write 被记录为立即返回。
标签: c++ networking boost boost-asio