[英]write_some: Broken pipe C++
我對boost::asio
有疑問。 我正在嘗試創建基本聊天,但遇到了 face write/write_some: Broken pipe
錯誤。 這是代碼
這里的 Message 是空vector<char> message
, data = "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_buffer
或resize(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.