考虑这段代码使用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));
如果接收器使用boost进行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.connect
和boost::asio::write
之间插入一个休眠,然后才能正常工作(因为这篇帖子提到了https://stackoverflow.com/a/20274486/3336423...。)。
我真的很讨厌必须这样做(在我的代码中添加睡眠)。还有其他选择吗?是否有一种is_ready
属性或类似的东西我可以用来知道什么时候我可以发送数据并确保听众会得到它?
额外奖励问题:这是一种Matlab错误吗?当接收器是C ++ / boost应用程序时,不需要睡眠....只有Matlab需要操作此睡眠才能接收传输的第一组数据吗?
答案 0 :(得分:0)
我同意对该链接答案的分析,并且很可能看起来Matlab是错误的。
除非您可以修复服务器(或,如果Matlab记录协议以便可靠地启动通信),否则不会有解决方案。
注意:您可以使用Asio进行异步IO操作。它还附带一个截止时间计时器。所以,如果你的抱怨是sleep
阻止了操作,可以通过稍微复杂的异步调用来规避这种操作。