gpt4 book ai didi

c++ - 不理解 boost error_codes

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

我的目标是用与平台无关的版本(适用于 windows 和 linux)替换一个非常非常简单的 winsock 实现,它工作得很好。使用 boost 来提供抽象层,主要是因为它在小组的其他地方使用过,而在罗马。这是一个简洁的库/框架,所以这不是咆哮..只是没有“得到”其中的一些,这可能会暴露一些基本的缺乏理解..请帮助我获得这样的理解。

我之前拥有的是服务器和客户端之间非常简单的 bing-[bang|bong] 通信。客户端发送bing,如果一切正常,服务器将回复bang,否则bong。不需要更多,尽管添加的能力就在那里。

现在,为了 boost ,我发现了各种各样的陷阱,主要归结为还没有接触到它,但我正在学习(我希望 visual studio 2005 的智能感知将它编目以使其更容易导航)。我发现 read() 方法会阻塞,直到连接超时,导致无法运行,这是实现持续通信的目标。我认为 socket.read_some( ) 方法可能对我有帮助……尝试一下。

我也在尝试重构连接建立代码以用作重新连接方法......这就是我遇到问题的地方。

考虑以下几点:

boost::system::error_code ServiceMonitorThread::ConnectToPeer(
tcp::socket &socket,
tcp::resolver::iterator endpoint_iterator)
{
boost::system::error_code error;
int tries = 0;

for (; tries < maxTriesBeforeAbort; tries++)
{
boost::asio::connect(socket, endpoint_iterator, error);

if (error && error != boost::system::errc::success)
{
// Error connecting to service... may not be running?
string errMsg = boost::system::system_error(error).what();
cerr << errMsg << endl;
boost::this_thread::sleep_for(boost::chrono::milliseconds(200));
}
}

if (tries == maxTriesBeforeAbort)
{
return boost::system::errc::host_unreachable;
}

return error;
}

以及使用上述内容的代码片段(尚未调试,可能未正确使用 read_some()):

socket.read_some(boost::asio::buffer(response), error);

switch (error)
{
case boost::system::errc::success:
break;

case boost::asio::error::eof:
// Connection was dropped, re-connect to the service.
error = ConnectToPeer(socket, endpoint_iterator);
if (error && error == boost::system::errc::host_unreachable)
{
TerminateProgram();
}
continue;

default:
// Other error while receiving from socket
string errMsg = boost::system::system_error(error).what();
cerr << errMsg << endl;
retry++;
continue;
}

现在,我知道 error_code 和 errc::errc_t 不是一回事......但你明白我想要完成的意图。如何在 boost 框架的意图下实现上述目标?

最佳答案

boost::system::error_code 包含类别和错误代码。它的目的是提供一个异构类型,它可以包含不同子系统的不同错误代码。

注意 system::error_code 可以转换为 bool,并且只有在出现错误时才会计算为 true:

auto bytes_read = socket.read_some(boost::asio::buffer(response), error);
if (error)
{
if (error == make_error_code(boost::asio::error::eof))
{
// Connection was dropped, re-connect to the service.
error = ConnectToPeer(socket, endpoint_iterator);
if (error && error == make_error_code(boost::system::errc::host_unreachable))
{
TerminateProgram();
}
continue;
}
else
{
cerr << error.message() << endl;
retry++;
continue;
}
}

有关 ADL 函数 make_error_code 的描述,请参阅 boost::system。

关于c++ - 不理解 boost error_codes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34024259/

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