gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:18:48 26 4
gpt4 key购买 nike

我正在努力通过同步客户端代码接收数据,该客户端代码使用带有 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);

最佳答案

问题是您只设置了传输端。

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

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,但在您更改它之前,这当然会限制您只能使用一个客户端。

关于c++ - 带有 Boost.Asio 的数据报 Unix 域套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12699114/

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