【问题标题】:Difference between read_some/write_some and receive/send?read_some/write_some 和接收/发送之间的区别?
【发布时间】:2011-08-12 17:50:32
【问题描述】:

我开始使用 Boost Asio 的 TCP 套接字。 read_somereceive 有什么区别,write_somesend 有什么区别?谢谢!

【问题讨论】:

    标签: c++ boost boost-asio


    【解决方案1】:

    据我所知,read_somereceive 实际上是在做同样的事情。我认为只接收调用 read_some 或反之亦然。一个命名来自将套接字视为文件(读/写)的想法,而另一个命名来自连接(发送/接收)点看法。 write_somesend 也应该如此。

    【讨论】:

    • 你有一些参考/链接吗?我在 boost 文档中找不到任何内容,并且 boost 示例不使用 send/receive
    【解决方案2】:

    BOOST ASIO documentationTCP Clients 部分说:

    可以使用 receive()、async_receive()、send() 或 async_send() 成员函数。 但是,由于这些可能导致short writes or reads, 应用程序通常会使用以下操作: read()、async_read()、write() 和 async_write()。

    【讨论】:

      【解决方案3】:

      一样。都调用 this->get_service().send()

       /// Send some data on the socket.
       /**
       * This function is used to send data on the stream socket. The function
       * call will block until one or more bytes of the data has been sent
       * successfully, or an until error occurs.
       *
       * @param buffers One or more data buffers to be sent on the socket.
       *
       * @returns The number of bytes sent.
       *
       * @throws boost::system::system_error Thrown on failure.
       *
       * @note The send operation may not transmit all of the data to the peer.
       * Consider using the @ref write function if you need to ensure that all data
       * is written before the blocking operation completes.
       *
       * @par Example
       * To send a single data buffer use the @ref buffer function as follows:
       * @code
       * socket.send(boost::asio::buffer(data, size));
       * @endcode
       * See the @ref buffer documentation for information on sending multiple
       * buffers in one go, and how to use it with arrays, boost::array or
       * std::vector.
       */
       template <typename ConstBufferSequence>
       std::size_t send(const ConstBufferSequence& buffers)
       {
         boost::system::error_code ec;
         std::size_t s = this->get_service().send(
         this->get_implementation(), buffers, 0, ec);
         boost::asio::detail::throw_error(ec, "send");
         return s;
       }
      
      ////////////////////////////////////////////
      template <typename ConstBufferSequence>
      std::size_t write_some(const ConstBufferSequence& buffers)
      {
        boost::system::error_code ec;
        std::size_t s = this->get_service().send(
          this->get_implementation(), buffers, 0, ec);
        boost::asio::detail::throw_error(ec, "write_some");
        return s;
      }
      

      来自 basic_stream_socket.hpp

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-12
        • 2022-01-18
        • 1970-01-01
        • 2012-08-15
        • 1970-01-01
        • 1970-01-01
        • 2016-01-09
        • 1970-01-01
        相关资源
        最近更新 更多