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

Posted

技术标签:

【中文标题】在打开套接字后立即将数据发送到套接字的替代方法【英文标题】:Alternative to sleep for sending data to a socket right after it's opened 【发布时间】:2016-06-03 12:02:02 【问题描述】:

考虑这段代码使用 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://***.com/a/20274486/3336423...。)。

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

额外的奖励问题:它是一种 Matlab 错误吗?由于当接收器是 C++/boost 应用程序时不需要休眠......是否只有 Matlab 需要运行此休眠才能接收传输的第一组数据?

【问题讨论】:

你能改变协议并让 Matlab 在准备好时发送一个数据包吗? 不,我们在 Matlab 和 C++ 程序之间没有通信,我们想保持简单,所以我们不想添加。 为什么不使用deadline_timer 而不是睡眠。但同样,这不能确定地起作用。 【参考方案1】:

我同意对该链接答案的分析,而且很明显 Matlab 有问题。

除非您可以修复服务器(如果 Matlab 记录了可靠启动通信的协议),否则不会有解决方案

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

【讨论】:

以上是关于在打开套接字后立即将数据发送到套接字的替代方法的主要内容,如果未能解决你的问题,请参考以下文章

Java socket 读取后立即写入

close函数

示例:使用AsyncTask的Android双向网络套接字

如何检测 Windows 中打开的套接字?

Java 可以并行运行同一个套接字的多个实例吗?

关闭后从套接字读取数据