gpt4 book ai didi

c++ - 立即使用 boost::asio 检测写入期间关闭的 TCP 连接

转载 作者:行者123 更新时间:2023-11-28 05:09:10 26 4
gpt4 key购买 nike

我有一个带有多个客户端/ session 的 TCP 服务器。每个 session 都有自己的线程用于从客户端接收数据,但只有一个线程(“writeThread”)响应所有客户端。

现在出现了问题,如果客户端在“writeThread”写入此套接字期间关闭了连接,则需要数秒时间,直到写入操作注意到连接已远程关闭。有时它根本没有注意到,就在我手动为已安装的 sighandler 发送 signal 时,应用程序会检测到它并中断写入操作。

时间是在 Logger::trace("start write");Logger::trace("remote term, closed socket "); 之间测量的p>

尽管这可能不是最好的设计,但是否有可能立即检测到关闭的连接,或者我真的必须重新设计?

bool myWrite(UINT8 *pu8_buffer, UINT32 u32_size)
{
bool b_success = false;
try
{
Logger::trace("start write");
b_success = (u32_size == boost::asio::write(_x_socket, boost::asio::buffer(pu8_buffer, u32_size)))
}
catch (boost::system::system_error &er)
{
if (er.code() == boost::asio::error::eof ||
er.code() == boost::asio::error::connection_reset)
{
boost::system::error_code x_er;
_x_socket.close(x_er);
if (!x_er)
{
Logger::trace("remote term, closed socket ");
}
else
{
Logger::err("remote term, closed socket failed");
}
}
}
catch(std::exception &ex)
{
Logger::err("write exception\n\t",ex.what());
}
catch(...)
{
Logger::err("write unknown exception",(uint32_t)this);
}
return b_success;
}

最佳答案

如果您使用异步写入操作,则可以在同一线程上多路复用写入,而不会阻塞另一个。您甚至可以对读取执行相同的操作。

关于c++ - 立即使用 boost::asio 检测写入期间关闭的 TCP 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43871882/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com