簡體   English   中英

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

[英]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類的sendsend_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_socketasio::ip::udp::socket

在我看來,asio :: write要求流類實現write_some。 IIRC,當寫入UDP套接字時,您希望一次寫入所有內容以減少碎片(除非您的數據+ UDP標頭+ ip標頭大小> PMTU,那么您還有一些工作要做)。

您是否在接收方有重新排序/重新組裝UDP數據包的代碼? 無論你的網絡有多好,你都會得到無序的UDP數據包和碎片。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM