简体   繁体   中英

write_some: Broken pipe C++

I have an issue with boost::asio . I'm trying to create basic chat, but have face write/write_some: Broken pipe error. Here's code

Client side

Message here it is empty vector<char> message , data = "Client" createMessage(message, data) put data into 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);
}

Server side

My server run on localhost with port 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;
        }
    }

}

Can you give any clue what is wrong with it?

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

Could be

    boost::asio::buffer(buffer)

And it doesn't work becuase buffer.size() is always zero. You should be using asio::dynamic_buffer or resize(n) instead of reserve(n)

Demo

I improvised a more complete example 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();
}

Prints eg client:

Success

Server:

"6666666666666666666666666666666666666666666666666666666666666666555555555555555555555555555555554444"

"444444444444333333332222110"
""
End of file

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM