簡體   English   中英

write_some:損壞的 pipe C++

[英]write_some: Broken pipe C++

我對boost::asio有疑問。 我正在嘗試創建基本聊天,但遇到了 face write/write_some: Broken pipe錯誤。 這是代碼

客戶端

這里的 Message 是空vector<char> messagedata = "Client" createMessage(message, data)將數據放入 message

void Client::connect()
{
    int port = 9999;
    boost::asio::io_context ioc;
    boost::system::error_code ec;
    boost::asio::ip::tcp::endpoint address(boost::asio::ip::address::from_string("127.0.0.1"), port);

    boost::asio::ip::tcp::socket socket(ioc);
    socket.connect(address, ec);
    if(ec)
    {
        std::cerr<<ec<<std::endl;
    }
    for(;;)
    {

        createMessage(message, data);
        // VARIANT 1
        boost::asio::write(socket, boost::asio::buffer(message.data(), message.size()));

        // VARIANT 2
        //socket.write_some(boost::asio::buffer(message));    
    }
    socket.shutdown(boost::asio::socket_base::shutdown_both);
}

服務器端

我的服務器在 localhost 上運行,端口為 9999。

void Server::start()
{    
    boost::system::error_code ec;
    std::vector<char> buffer;
    buffer.reserve(2 * 1024);
    boost::asio::ip::tcp::endpoint address(boost::asio::ip::tcp::v4(), port);
    boost::asio::ip::tcp::acceptor acc(ioc, address);
    for(;;)
    {
        boost::asio::ip::tcp::socket socket(ioc);
        acc.accept(socket);
        if(ec)
        {
             std::cerr<<ec<<std::endl;
             return;
        }
        socket.read_some(boost::asio::buffer(buffer.data(), buffer.size()));
        for(auto& i : buffer)
        {
            std::cout<<i<<std::flush;
        }
    }

}

你能提供任何線索有什么問題嗎?

    boost::asio::buffer(buffer.data(), buffer.size())

可能

    boost::asio::buffer(buffer)

它不起作用,因為buffer.size()始終為零。 您應該使用asio::dynamic_bufferresize(n)而不是reserve(n)

演示

我即興創作了一個更完整的例子Live On Coliru

#include <boost/asio.hpp>
#include <iostream>
#include <iomanip>

static boost::asio::io_context ioc;
static constexpr uint16_t port = 9999;
using boost::asio::ip::tcp;
using boost::system::error_code;

void createMessage(std::string& message, int data) {
    message = std::to_string(data);
    while (data--)
        message += message;
}

void Client_connect(std::string message, int data) {
    error_code ec;
    tcp::endpoint address({}, port);

    tcp::socket socket(ioc);
    socket.connect(address, ec);

    for (;data-- && !ec;) {
        createMessage(message, data);
        boost::asio::write(socket, boost::asio::buffer(message), ec);
    }
    std::cerr << ec.message() << std::flush;
    socket.shutdown(boost::asio::socket_base::shutdown_both);
}

void Server_start() {
    tcp::acceptor acc(ioc, {{}, port});

    for (;;) {
        tcp::socket socket(ioc);
        error_code ec;
        acc.accept(socket, ec);

        for (std::string buffer; !ec;) {
            buffer.resize(100); // max 100 byte reads

            auto n = socket.read_some(boost::asio::buffer(buffer), ec);
            buffer.resize(n);
            std::cout << std::quoted(buffer) << std::flush;
        }
        std::cerr << ec.message() << std::endl;
    }
}

int main(int argc, char**) {
    if (argc>1)
        Client_connect("", 7);
    else
        Server_start();
}

打印例如客戶端:

Success

服務器:

"6666666666666666666666666666666666666666666666666666666666666666555555555555555555555555555555554444"

"444444444444333333332222110"
""
End of file

暫無
暫無

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

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