睡眠的替代方法,用于在套接字打开后立即将数据发送到套接字

Alternative to sleep for sending data to a socket right after it's opened

本文关键字:套接字 数据 方法 用于      更新时间:2023-10-16

考虑这段代码,使用 bost 打开一个套接字并发送一些数据:

boost::asio::io_service service;
tcp::resolver resolver(service);
tcp::resolver::query query(tcp::v4(), "localhost", 2000);
tcp::resolver::iterator iterator = resolver.resolve( query );
boost::asio::ip::tcp::socket socket(service);
socket.connect(*iterator);
boost::asio::write(socket, boost::asio::buffer(data, size));

如果接收器以带升压C++编码,则可以接收数据。但是,我们正在尝试从 Matlab 接收数据,而这个没有接收数据:

t=tcpip('localhost', 2000, 'NetworkRole', 'server');
fopen(t);
// Now we launch the C++ code above from another process
// Now t.BytesAvailable remains 0

为了接收数据,我们需要在 socket.connectboost::asio::write 之间插入睡眠,然后它运行良好(正如这篇文章 https://stackoverflow.com/a/20274486/3336423 提到的......

我真的很讨厌这样做(在我的代码中添加睡眠)。还有其他选择吗?是否有某种is_ready属性或类似的东西可以用来知道何时可以发送数据并确保侦听器会得到它?

额外的奖励问题:它是一种 Matlab 错误吗?由于当接收器是C++/升压应用时不需要睡眠。是否只有 Matlab 需要操作此睡眠才能接收传输的第一组数据?

我同意对链接答案的分析,而且看起来 Matlab 有问题。

除非你能修复服务器(或者如果Matlab记录了一个协议来可靠地启动通信),否则不会有解决方案。

注意:您可以使用 Asio 执行异步 IO 操作。它还带有截止日期计时器。因此,如果您的抱怨是sleep阻塞操作,那么可以通过稍微复杂的异步调用来规避。