を使用してアイドル ループを実行しようとしていますlibmpdclient
が、既に最初のアイドル コールで、明らかに回復不能なエラー状態になります。
のパラメーターに渡しfalse
ているので、ループを外部から停止して (バックグラウンド スレッドで実行されます)、クリーンなシャットダウン手順を確実に実行できます。disable_timeout
mpd_recv_idle
ここに私のテストコードがあります:
#include <string>
#include <stdexcept>
#include <memory>
#include <mpd/client.h>
typedef std::unique_ptr<mpd_connection, decltype(&mpd_connection_free)>
mpd_connection_ptr;
void
check_error (const mpd_connection_ptr &c, const std::string &s)
{
if (mpd_connection_get_error (c.get ()) != MPD_ERROR_SUCCESS)
{
throw std::runtime_error (s);
}
}
int
main (void)
{
const std::string host = "127.0.0.1";
const uint16_t port = 7701;
const int timeout = 1 * 1000;
mpd_connection_ptr c {mpd_connection_new (host.c_str (), port, timeout),
&mpd_connection_free
};
if (c == nullptr)
{
throw std::runtime_error ("connection_new returned nullptr");
}
if (!mpd_send_idle (c.get ()))
{
throw std::runtime_error ("mpd_send_idle returned false");
}
check_error (c, "mpd_send_idle caused error status");
auto idle = mpd_recv_idle (c.get (), false);
if (idle == 0)
{
if (mpd_connection_get_error (c.get ()) == MPD_ERROR_TIMEOUT)
{
if (!mpd_connection_clear_error (c.get ()))
{
throw std::runtime_error ("mpd_connection_clear_error returned false");
}
}
else
{
check_error (c, "mpd_recv_idle caused error status");
}
}
return 0;
}
このコードを実行すると (mpd は 127.0.0.1:7701 で実行されています。 で確認しましたnetstat
)、次の結果が得られます。
terminate called after throwing an instance of 'std::runtime_error'
what(): mpd_connection_clear_error returned false
ここでタイムアウトエラーをクリアできないのはなぜですか?回復可能な状況のように見えますか?