[英]C++: does boost::asio:write() not support UDP sockets?
嘗試使用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::write()
:
發送操作可能不會將所有數據發送到對等方。 如果需要確保在阻塞操作完成之前寫入所有數據,請考慮使用write函數
...但是回過頭來看,我看到文本只在boost::asio::ip::tcp::socket::send()
而不是在UDP版本中。 資源。
假設您需要同步行為,則需要使用boost::asio::ip::udp::socket
類的send或send_to成員方法。 boost::asio::write
free函數使用SyncWriteStream類型要求,UDP套接字不符合要求。
我使用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
。
在我看來,asio :: write要求流類實現write_some。 IIRC,當寫入UDP套接字時,您希望一次寫入所有內容以減少碎片(除非您的數據+ UDP標頭+ ip標頭大小> PMTU,那么您還有一些工作要做)。
您是否在接收方有重新排序/重新組裝UDP數據包的代碼? 無論你的網絡有多好,你都會得到無序的UDP數據包和碎片。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.