睡眠的替代方法,用于在套接字打开后立即将数据发送到套接字
Alternative to sleep for sending data to a socket right after it's opened
考虑这段代码,使用 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.connect
和 boost::asio::write
之间插入睡眠,然后它运行良好(正如这篇文章 https://stackoverflow.com/a/20274486/3336423 提到的......
我真的很讨厌这样做(在我的代码中添加睡眠)。还有其他选择吗?是否有某种is_ready
属性或类似的东西可以用来知道何时可以发送数据并确保侦听器会得到它?
额外的奖励问题:它是一种 Matlab 错误吗?由于当接收器是C++/升压应用时不需要睡眠。是否只有 Matlab 需要操作此睡眠才能接收传输的第一组数据?
我同意对链接答案的分析,而且看起来 Matlab 有问题。
除非你能修复服务器(或者如果Matlab记录了一个协议来可靠地启动通信),否则不会有解决方案。
注意:您可以使用 Asio 执行异步 IO 操作。它还带有截止日期计时器。因此,如果您的抱怨是sleep
阻塞操作,那么可以通过稍微复杂的异步调用来规避。
相关文章:
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- WTSEnumerateProcesses与套接字和数据结构
- 在 1 个服务器 n 客户端套接字 C++ MFC 应用程序中更新数据的客户端
- C++ TCP 套接字通信 - 连接按预期工作,几秒钟后失败,没有收到新数据,read() 和 recv() 块
- 我们可以在套接字编程中将自定义数据作为辅助数据发送吗?
- TCP 服务器的异步读取使用 boost::asio 打印客户端套接字发送的数据
- 尝试将数据从C++发送到 Python 并使用套接字C++反转,C++ sendto() 和 python recvfr
- 不要从输入队列套接字读取数据
- 通过套接字 c++ 发送长度和数据
- 如何读取套接字编程(c ++)中的所有数据?
- 使用 Broadcast 发出的从节点服务器发送的数据不能被 C++ 套接字 IO 客户端读取
- 无法通过套接字发送或接收数据
- 连接UDP套接字,但仍然接收来自其他源的数据报
- boost::asio-async_read_some示例代码没有读取套接字中的所有数据
- 使用 epoll 边缘触发器的套接字上的数据过多
- 为什么 sys 套接字 recv 函数不填充数据但返回字节长度?
- 将空数据写入非阻塞套接字会导致epoll_wait挂起
- C++ 套接字 - 发送 - 未收到数据
- 通过套接字发送的自定义数据包
- 无法在java(客户端)的套接字上正确写入数据(类),也无法在c ++(服务器)上读取数据(类)