Reputation: 33
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
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);
}
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?
Upvotes: 1
Views: 510
Reputation: 393259
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)
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 e.g. client:
Success
Server:
"6666666666666666666666666666666666666666666666666666666666666666555555555555555555555555555555554444"
"444444444444333333332222110"
""
End of file
Upvotes: 2