在Socket关闭之前数据不发送

时间:2017-05-02 20:05:52

标签: c++ sockets networking boost boost-asio

我正在学习一些网络编程,并建议使用boost-asio。我在http://www.boost.org/doc/libs/1_64_0/doc/html/boost_asio/tutorial.html上做了Daytime Tutorials 1& 2并想要修改它,以便服务器对发送序列化对象的客户端作出反应然后发回结果。我想象使用类似下面的顺序,意图客户端将坐在handleRead循环中等待服务器完成:

服务器:
接受 - > handleRead - > process_read - >执行操作 - > handleWrite

客户端:
连接 - > handleWrite - > handleRead - > process_read

但是,当我这样做时,服务器和客户端都会在我设置的读取循环中陷入困境。这在客户端是可取的,但客户端应该在进入读取循环之前写入并发送数据。当我在客户端断开连接或在我写的写入函数的末尾添加socket.close()时,所有其余的服务器步骤都会使用从客户端发送的相应数据进行。

我原本以为这个问题与启用Nagle的算法有关,但是添加了

boost::asio::ip::tcp::no_delay option(true);
socket.set_option(option);

根本没有帮助。我是否遗漏了教程中没有关于如何发送这些数据的内容,例如刷新套接字?

void myClient::handle_read()
{
    boost::system::error_code e;
    try
    {       
        for (;;)
        {
            size_t len = boost::asio::read(socket, boost::asio::buffer(inBuffer), e);

            std::cout << "Client Received: ";

            if (e == boost::asio::error::eof)
            {
                break;
            }

            else if (e)
            {
                throw boost::system::system_error(e);
            }
        }
    }

    catch (std::exception& e)
    {
        std::cerr << e.what() << std::endl;
        std::cout << e.what() << std::endl;
    }
}

template <typename T>
void handleWrite(T& t)
{
    std::ostringstream archive_stream;
    std::string tempString;

    boost::archive::text_oarchive archive(archive_stream);
    archive << t;

    tempString = archive_stream.str();
    outBuffer.assign(tempString.begin(), tempString.end());

    boost::system::error_code ignored_error;
    size_t sent = boost::asio::write(socket, boost::asio::buffer(outBuffer), ignored_error);
    std::cout << sent << std::endl;
}

我对c ++和网络编程还是比较陌生的,所以我们也非常感谢任何其他文档。谢谢!

1 个答案:

答案 0 :(得分:1)

当然,你陷入了阅读循环。它直到蒸汽结束才退出,流的结束仅在对等体关闭套接字时发生。