带有Boost.Asio的数据报Unix域套接字

时间:2012-10-02 22:09:22

标签: c++ boost boost-asio

我很难接收使用带有Boost.Asio的数据报Unix套接字的同步客户端代码的数据。

服务器似乎工作正常,因为如果我用 netcat 连接它,我会收到数据。但是,在尝试使用下面的代码时,它会卡在receive_from()中。 strace 表明调用了receive_from()系统调用,但没有收到任何内容,而服务器上的 strace 显示正在尝试向客户端发送数据但是它未能这样做。

boost::asio::io_service io_service;

boost::asio::local::datagram_protocol::socket socket(io_service);
socket.open();

cmd::cmd cmd;
cmd.type = cmd::cmdtype::request;
cmd.id = cmd::cmdid::dumptop;

boost::asio::local::datagram_protocol::endpoint receiver_endpoint("socket.unix");

/* The server receives this data successfully */
socket.send_to(
    boost::asio::buffer(reinterpret_cast<char*>(&cmd), 
    sizeof(cmd)),
    receiver_endpoint
);

boost::array<char, 128> recv_buf;
boost::asio::local::datagram_protocol::endpoint ep;

/* When the server sends data, nothing is received here.
   Maybe it's an issue with the endpoint??? */
size_t len = socket.receive_from(
    boost::asio::buffer(recv_buf), ep);

1 个答案:

答案 0 :(得分:0)

问题是你只设置了发送端。

要通过同一个套接字接收,您需要绑定到文件名,就像在服务器端一样。以下是代码最后几行的修改版本:

boost::array<char, 128> recv_buf;
boost::asio::local::datagram_protocol::endpoint ep("socket.unix.client");
// bind to the previously created and opened socket:
socket.bind(ep);

/* now get data from the server */
size_t len = socket.receive_from(
    boost::asio::buffer(recv_buf), ep);

通常的习惯用法是服务器有一个众所周知的文件名(代码中为socket.unix),并且每个通信客户端都会通过附加自己的pid来创建自己的唯一名称。此示例仅使用socket.unix.client来简化,但当然,在您更改之前,这将限制您只使用一个客户端。