尝试使用boost::asio::write()
写入boost::asio::ip::udp::socket
对象。虽然我正在忙着重新阅读文档以查看我是否在某个地方出错,但是有人可以确认是否可能不支持此操作吗?我现在认为boost::asio::write()
仅支持tcp::socket
个对象,而不是udp::socket
。
这是我尝试编译时得到的结果:
/usr/include/boost/asio/impl/write.ipp: In function ‘size_t
boost::asio::write(SyncWriteStream&, const ConstBufferSequence&, [...cut...]
test/test.cpp:76: instantiated from here
/usr/include/boost/asio/impl/write.ipp:44: error: ‘class
boost::asio::basic_datagram_socket<boost::asio::ip::udp,
boost::asio::datagram_socket_service<boost::asio::ip::udp> >’ has no member named
‘write_some’
我想我在文档中读到这个时决定尝试boost::asio::write()
:
发送操作可能不会将所有数据传输到对等方。考虑使用 写函数,如果你需要确保所有数据都是在之前写的 阻止操作完成。
...但回过头来看,我发现该文本只在boost::asio::ip::tcp::socket::send()
而不在UDP版本中。 Source.
答案 0 :(得分:4)
假设您需要同步行为,则需要使用boost::asio::ip::udp::socket
类的send或send_to成员方法。 boost::asio::write
免费函数使用SyncWriteStream类型要求,UDP套接字不符合该要求。
答案 1 :(得分:1)
我改用async_send_to
。也许你也可以这样做?
void MyUdpServer::sendMessage(Message& message)
{
m_message = message;
m_socket.async_send_to(
asio::buffer(&m_message, sizeof(m_message)), m_endpoint,
boost::bind(&MyUdpServer::handle_send_to, shared_from_this(),
asio::placeholders::error));
}
其中m_socket
是asio::ip::udp::socket
。
答案 2 :(得分:0)
在我看来,asio :: write要求流类实现write_some。 IIRC,当写入UDP套接字时,你想一次写入所有内容以减少碎片(除非你的数据+ UDP标头+ ip标头大小是&gt; PMTU,那么你还有一些工作要做)。
您是否在接收方有重新排序/重新组装UDP数据包的代码?无论你的网络有多好,你都会得到无序的UDP数据包和碎片。