server_ = server;
socket_.reset(new ip::tcp::socket(service));
socket_->open(ip::tcp::v6());
+ send_delay_timer_.reset(new deadline_timer(service));
}
size_t send_bytes)
{
if (!error && send_bytes == 2 && send_data_len_delay_ == 0) {
- sleep(send_data_delay_);
- socket_->async_send(buffer(data_to_send_.c_str(),
- data_to_send_.size() + 1),
- boost::bind(&TCPClient::finishSendHandler, this, _1, _2));
+ // We cannot block here (such as by sleep(3)) since otherwise
+ // the ASIO events may not reliably handled in the server side
+ // as the test expects. So we use async_wait, and make sure the
+ // control will be given back to the IO service.
+ if (send_data_delay_ > 0) {
+ send_delay_timer_->expires_from_now(boost::posix_time::
+ seconds(send_data_delay_));
+ send_delay_timer_->async_wait(
+ boost::bind(&TCPClient::sendMessageData, this));
+ return;
+ }
+ sendMessageData();
}
}
+ void sendMessageData() {
+ socket_->async_send(buffer(data_to_send_.c_str(),
+ data_to_send_.size() + 1),
+ boost::bind(&TCPClient::finishSendHandler, this,
+ _1, _2));
+ }
+
void finishSendHandler(const asio::error_code& error, size_t send_bytes) {
- if (!error && send_bytes == data_to_send_.size() + 1) {
+ if (error) {
+ getResponseCallBack(error, 0);
+ } else if (send_bytes == data_to_send_.size() + 1) {
socket_->async_receive(buffer(received_data_, MAX_DATA_LEN),
boost::bind(&SimpleClient::getResponseCallBack, this, _1,
_2));
ip::tcp::endpoint server_;
std::string data_to_send_;
uint16_t data_to_send_len_;
+ boost::shared_ptr<deadline_timer> send_delay_timer_;
size_t send_data_delay_;
size_t send_data_len_delay_;