服务器write后客户端响应,当服务器执行asio::write操作时客户端断开连接时提升TCP服务器崩溃...

为了测试我的服务器,我从客户端使用for循环创建了100个请求,而当我的服务器为第N个请求编写响应时,我特意按下了客户端的control + c,这就是它。服务器停止并且没有响应,尽管我尝试使用新连接来连接它,任何人都可以告诉我如何让我的服务器稳定并且免于这种中断。

这里是我的服务器:

class tcp_server

{

public:

tcp_server(boost::asio::io_service& io_service)

: acceptor_(io_service, tcp::endpoint(tcp::v4(), 2020))

{

start_accept();

}

private:

void start_accept()

{

tcp_connection::pointer new_connection =

tcp_connection::create(acceptor_.get_io_service());

acceptor_.async_accept(new_connection->socket(),

boost::bind(&tcp_server::handle_accept, this, new_connection,

boost::asio::placeholders::error));

}

void handle_user_read(const boost::system::error_code& err,

std::size_t bytes_transferred)

{

}

void handle_accept(tcp_connection::pointer new_connection,

const boost::system::error_code& error)

{

if (!error)

{

new_connection->start();

start_accept();

}

}

tcp::acceptor acceptor_;

};这里是我的tcp连接:

class tcp_connection : public boost::enable_shared_from_this

{

public:

typedef boost::shared_ptr pointer;

static pointer create(boost::asio::io_service& io_service)

{

return pointer(new tcp_connection(io_service));

}

tcp::socket& socket()

{

return socket_;

}

void start()

{

// Start reading messages from the server

start_read();

}

public:

tcp_connection(boost::asio::io_service& io_service) : socket_(io_service),timer_(io_service), io(io_service),timer2_(io_service)

{

}

// Reading messages from the server

void start_read()

{

boost::asio::async_read(socket_, input_buffer_,

boost::asio::transfer_at_least(1),

boost::bind(&tcp_connection::handle_read, shared_from_this(),

boost::asio::placeholders::error));

timer_.expires_from_now(boost::posix_time::seconds(120));

timer_.async_wait(boost::bind(&tcp_connection::close, shared_from_this()));

}

void close()

{

cout<

socket_.close();

}

// When stream is received, handle the message from the client

int handle_read(const boost::system::error_code& ec)

{

if (!ec)

{

std::istream is(&input_buffer_);

std::string line;

std::getline(is, line);

messageFromClient_+=line;

messageFromClient_.erase(std::remove(messageFromClient_.begin(), messageFromClient_.end(), '\n'), messageFromClient_.end());

std::size_t found = messageFromClient_.find('\0');

if(found==std::string::npos)

{

boost::asio::async_read(socket_, input_buffer_,

boost::asio::transfer_at_least(1),

boost::bind(&tcp_connection::handle_read, shared_from_this(),

boost::asio::placeholders::error));

}

else{

performmaj();--my logic never mind.

std::cout << "Request: "<

boost::asio::ip::tcp::no_delay option(true);

socket_.set_option(option);

write();

messageToClient_="";--my logic.

boost::system::error_code tc;

socket_.shutdown(boost::asio::ip::tcp::socket::shutdown_send, tc);

}

std::cout << "Request: "<

++i;

(boost::asio::io_service io);

}else

{

std::cout << "Error on receive: " << ec.message() << "\n";

}

}

void write()

{

try{

boost::asio::write(socket_,boost::asio::buffer(messageToClient_), boost::asio::transfer_at_least(messageToClient_.size()));

}catch(exception e)

{

cout<

socket_.close();

io.run();

}

}请参阅我的下面的代码,我已经使用async_write;请注意我写入的字符串的大小为:11279204。但是在下面的代码中使用async_write让我的客户端可以接收更多部分但不完整的meaasage。

class tcp_connection : public boost::enable_shared_from_this

{

public:

typedef boost::shared_ptr pointer;

static pointer create(boost::asio::io_service& io_service)

{

return pointer(new tcp_connection(io_service));

}

tcp::socket& socket()

{

return socket_;

}

void start()

{

// Start reading messages from the server

start_read();

}

public:

tcp_connection(boost::asio::io_service& io_service) : socket_(io_service),timer_(io_service), io(io_service),timer2_(io_service)

{

//io=io_service;

}

// Reading messages from the server

void start_read()

{

boost::asio::async_read(socket_, input_buffer_,

boost::asio::transfer_at_least(1),

boost::bind(&tcp_connection::handle_read, shared_from_this(),

boost::asio::placeholders::error));

timer_.expires_from_now(boost::posix_time::seconds(120));

timer_.async_wait(boost::bind(&tcp_connection::close, shared_from_this()));

}

void close()

{

cout<

socket_.close();

}

// When stream is received, handle the message from the client

int handle_read(const boost::system::error_code& ec)

{

if (!ec)

{

std::istream is(&input_buffer_);

std::string line;

std::getline(is, line);

messageFromClient_+=line;

messageFromClient_.erase(std::remove(messageFromClient_.begin(), messageFromClient_.end(), '\n'), messageFromClient_.end());

std::size_t found = messageFromClient_.find('\0');

if(found==std::string::npos)

{

boost::asio::async_read(socket_, input_buffer_,

boost::asio::transfer_at_least(1),

boost::bind(&tcp_connection::handle_read, shared_from_this(),

boost::asio::placeholders::error));

}

else{

performmaj();

cout<

try{

boost::asio::async_write(socket_, boost::asio::buffer(messageToClient_.data(),messageToClient_.size()),

// boost::asio::transfer_at_least(messageToClient_.size()),

boost::bind(&tcp_connection::handle_write, shared_from_this(),

boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));

}catch(exception e)

{

Shutdown();

}

}

std::cout << "Request: "<

++i;

return 0;

}else

{

std::cout << "Error on receive: " << ec.message() << "\n";

}

}

void Shutdown()

{

try {

socket_.shutdown(socket_.shutdown_both);

socket_.close();

} catch (std::exception &e)

{

std::cout << "Error Closing Socket" << e.what() << std::endl;

}

}

void performmaj()

{

std::size_t found = messageFromClient_.find('\0');

if (found!=std::string::npos)

{

std::cout << "Request: "<

std::cout << "Request: "<

if (messageFromClient_.size () > 0) messageFromClient_.resize (messageFromClient_.size () - 1);

messageToClient_=test(messageFromClient_);

messageFromClient_="";

messageToClient_.erase(std::remove(messageToClient_.begin(), messageToClient_.end(), '\n'), messageToClient_.end());

}

}

void handle_write(const boost::system::error_code& ec,

size_t bytes_transferred)

{

boost::asio::async_write(socket_,boost::asio::buffer(messageToClient_.data(),bytes_transferred),

// boost::asio::transfer_at_least(bytes_transferred),

boost::bind(&tcp_connection::handle_write, shared_from_this(),

boost::asio::placeholders::error,

bytes_transferred));

boost::system::error_code tc;

socket_.shutdown(boost::asio::ip::tcp::socket::shutdown_send, tc);

}

tcp::socket socket_;

std::string messageToClient_;

boost::asio::streambuf input_buffer_;

std::string messageFromClient_;

boost::asio::io_service& io;

boost::asio::deadline_timer timer_,timer2_;

};async_write的上述不可预知的行为已经导致我使用asio :: write。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值