c++ - 使用一个TCP套接字的多个请求

标签 c++ sockets boost

我正在学习套接字编程(和C++)。我写了一个下面的函数,要求一个数组的总和(使用boost库):

std::future<void> AsyncClient::ReqSum(const std::vector<double>& numbers)
{
    return std::async(
        std::launch::async,
        [&, numbers]()
        {
            // Setup connection.
            boost::asio::io_service _ioservice;
            tcp::socket _socket(_ioservice);
            _socket.connect(m_endpoint);

            std::string requestJson = Serializer::ArraySumRequest(numbers);
            boost::system::error_code err;
            while (true)
            {
                boost::asio::write(_socket, boost::asio::buffer(requestJson), err);
                if (err)
                {
                    std::stringstream ss;
                    ss << "Couldn't write to socket! error code: " << err;
                    throw ss.str();
                }

                // getting response from server
                boost::asio::streambuf receiveBuffer;
                boost::asio::read(_socket, receiveBuffer, boost::asio::transfer_all(), err);

                if (err && err != boost::asio::error::eof)
                {
                    std::stringstream ss;
                    ss << "Receiving from the server failed! error code: " << err.message();
                    throw ss.str();
                }

                const char* data = boost::asio::buffer_cast<const char*>(receiveBuffer.data());

                rapidjson::Document doc;
                doc.Parse<rapidjson::kParseDefaultFlags>(data);

                if (!doc.HasMember("result"))
                    throw "No result found!";

                double result = doc["result"].GetDouble();

                std::cout << "Sum of the array: " << result << std::endl;
            }
            _socket.shutdown(boost::asio::socket_base::shutdown_both);
            _socket.close();
        });
}
第一次写入和读取都可以正常工作,但是第二次进入循环写入套接字可以正常工作,但是读取时出现错误:

error code: 10053; message: An established connection was aborted by the software in your machine host.


此错误与我的机器有关吗?我应该怎么做才能做到这一点?

最佳答案

您似乎正在尝试从服务器接收所有数据:

boost::asio::streambuf receiveBuffer;
boost::asio::read(_socket, receiveBuffer, boost::asio::transfer_all(), err);
read()命令完成的唯一方法是服务器指示流的结尾。由于您是第一次收到有效的响应,这意味着服务器在向您发送响应后立即关闭了连接。

关于c++ - 使用一个TCP套接字的多个请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64069424/

相关文章:

python - 通过固定大小的python数据套接字发送整数

java - 套接字中的问题

即使设置了 header 搜索路径并安装了 boost,Xcode pch 文件也无法找到 boost

c++ - 如何使用 Solaris Studio 12.4 编译器构建 Boost V1.57

c++ - 我们如何使用#pragma 警告禁用链接器警告?

c++ - 内联函数模板特化

java - DatagramPacket - getData 是否总是返回传递的相同缓冲区?

c++ - 如何防止ptr_map在插入失败时释放数据

c++ - is_constexpr 在 C++11 中可能吗?

c++ - Netbeans 7.1.1 中的 boost