C ++:boost :: asio:write()不支持UDP套接字吗?

时间:2011-01-03 07:55:03

标签: c++ boost-asio

尝试使用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.

3 个答案:

答案 0 :(得分:4)

假设您需要同步行为,则需要使用boost::asio::ip::udp::socket类的sendsend_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_socketasio::ip::udp::socket

答案 2 :(得分:0)

在我看来,asio :: write要求流类实现write_some。 IIRC,当写入UDP套接字时,你想一次写入所有内容以减少碎片(除非你的数据+ UDP标头+ ip标头大小是&gt; PMTU,那么你还有一些工作要做)。

您是否在接收方有重新排序/重新组装UDP数据包的代码?无论你的网络有多好,你都会得到无序的UDP数据包和碎片。