简体   繁体   English

write_some:损坏的 pipe C++

[英]write_some: Broken pipe C++

I have an issue with boost::asio .我对boost::asio有疑问。 I'm trying to create basic chat, but have face write/write_some: Broken pipe error.我正在尝试创建基本聊天,但遇到了 face write/write_some: Broken pipe错误。 Here's code这是代码

Client side客户端

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

Server side服务器端

My server run on localhost with port 9999.我的服务器在 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;
        }
    }

}

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.它不起作用,因为buffer.size()始终为零。 You should be using asio::dynamic_buffer or resize(n) instead of reserve(n)您应该使用asio::dynamic_bufferresize(n)而不是reserve(n)

Demo演示

I improvised a more complete example Live On Coliru我即兴创作了一个更完整的例子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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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