【问题标题】:using boost asio to write to carbon gives broken pipe使用 boost asio 写入碳会导致管道损坏
【发布时间】:2017-03-03 12:43:12
【问题描述】:

我在 localhost 上运行了 Grafana 和 Graphite。一切都设置为默认值,因此为端口 2003 配置了明文协议,如 here 所述

以下工作可按需要进行:

export SERVER=localhost
export PORT=2003
echo "no_cluster.fake_xen.sample 25 1488542618" | nc  ${SERVER} ${PORT}

给我我期望的数据点(根据需要调整时间戳)。

以下最小可编译示例:

#include <chrono>
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <boost/asio.hpp>

namespace basio = boost::asio;

void post_to_carbon (std::string message)
{
    using btcp = boost::asio::ip::tcp;
    constexpr const char* carbon_port="2003";
    basio::io_service ios;
    btcp::resolver resolver(ios);
    btcp::resolver::query query("localhost", carbon_port);
    btcp::endpoint carbon_endpoint = *resolver.resolve(query);
    btcp::socket sock(ios,carbon_endpoint);
    boost::system::error_code ignored_error;
    basio::write(sock, basio::buffer(message), ignored_error);
    std::cout << "posting: " << message << " gave: " << ignored_error.message() << "\n";

}

int main() {
    post_to_carbon("no_cluster.fake_xen.sample 25 1488542800");
}

失败并显示错误消息:

posting: no_cluster.fake_xen.sample 25 1488542800 gave: Broken pipe

谁能告诉我我做错了什么?

【问题讨论】:

  • io_service::run() 是一个阻塞调用。您似乎正在使用同步调用,所以不需要它
  • 糟糕。那是我在与一些例子进行比较时添加的一句祝福语。打算在粘贴代码之前将其取出,现在已经这样做了。行为仍然相同。

标签: c++ boost boost-asio graphite


【解决方案1】:

socket(io_service, endpoint) 的构造函数形式将套接字的本地端点绑定到给定的端点。

我想你想做的是:

btcp::socket sock(ios);
sock.connect(carbon_endpoint /* , error_code */);

【讨论】:

  • 感谢您的想法。现在我得到“连接:连接被拒绝”。有什么想法吗?
  • 因为另一端没有正常监听
  • 听起来很合理,但 ncat 工作正常...它的作用与我做的不同吗?
  • 嗯好的,在这种情况下,请参见 asio UDP 客户端示例:boost.org/doc/libs/1_35_0/doc/html/boost_asio/tutorial/…
  • 知道了。 carbon 在 tcp 上侦听(否则我必须使用 -u 才能使 ncat 正常工作)。问题是“localhost”没有正确解决(有人知道为什么吗?)。将其更改为 IP 号码可解决连接问题。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-12
  • 1970-01-01
  • 2011-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多