int SrsRtmp::handshake()
{
	int ret = ERROR_SUCCESS;
	
    SrsSocket skt(stfd);
    
    SrsComplexHandshake complex_hs;
    SrsSimpleHandshake simple_hs;
    if ((ret = simple_hs.handshake_with_client(skt, complex_hs)) != ERROR_SUCCESS) {
        return ret;
    }
    
    return ret;
}
示例#2
0
文件: test_ssl.hpp 项目: BianJian/mmo
  static void echo_client(stackful_actor self)
  {
    log::logger_t& lg = self.get_context().get_logger();
    try
    {
      size_t ecount = 10;
      errcode_t ec;

      boost::shared_ptr<tcp_resolver_t::iterator> eitr;
      boost::shared_ptr<boost::asio::ssl::context> ssl_ctx;
      self->match("init").recv(eitr, ssl_ctx);

      ssl::stream<> skt(self, *ssl_ctx);
      skt->set_verify_mode(boost::asio::ssl::verify_peer);
      skt->set_verify_callback(boost::bind(&ssl_ut::verify_certificate, _arg1, _arg2, lg));

      skt.async_connect(*eitr);
      self->match(tcp::as_conn).recv(ec);
      GCE_VERIFY(!ec).except(ec);

      skt.async_handshake(boost::asio::ssl::stream_base::client);
      self->match(ssl::as_handshake).recv(ec);
      GCE_VERIFY(!ec).except(ec);

      echo_header hdr;
      size_t hdr_len = amsg::size_of(hdr);
      amsg::zero_copy_buffer zbuf;

      char buff[256];
      std::string str("hello world!");
      hdr.size_ = amsg::size_of(str);

      zbuf.set_write(buff, 256);
      amsg::write(zbuf, hdr);
      amsg::write(zbuf, str);

      for (size_t i=0; i<ecount; ++i)
      {
        skt.async_write(boost::asio::buffer(buff, hdr_len + hdr.size_));
        self->match(tcp::as_send).recv(ec);
        GCE_VERIFY(!ec).except(ec);

        skt.async_read(hdr_len + hdr.size_);
        message::chunk ch(hdr_len + hdr.size_);
        self->match(tcp::as_recv).recv(ec, ch);

        zbuf.set_read(ch.data(), hdr_len + hdr.size_);
        std::string echo_str;
        amsg::read(zbuf, hdr);
        amsg::read(zbuf, echo_str);
        GCE_VERIFY(!zbuf.bad()).except<std::runtime_error>();
        GCE_VERIFY(str == echo_str);
      }

      str.assign("bye");
      hdr.size_ = amsg::size_of(str);

      zbuf.set_write(buff, 256);
      amsg::write(zbuf, hdr);
      amsg::write(zbuf, str);
      skt.async_write(boost::asio::buffer(buff, hdr_len + hdr.size_));
      self->match(tcp::as_send).recv(ec);
      GCE_VERIFY(!ec).except(ec);

      skt.async_shutdown();
      self->match(ssl::as_shutdown).recv();
    }
    catch (std::exception& ex)
    {
      GCE_ERROR(lg) << ex.what();
    }
  }
示例#3
0
文件: test_ssl.hpp 项目: BianJian/mmo
  static void echo_session(stackful_actor self)
  {
    log::logger_t& lg = self.get_context().get_logger();
    try
    {
      boost::shared_ptr<ssl_socket_t> ssl_skt;
      self->match("init").recv(ssl_skt);

      ssl::stream<> skt(self, ssl_skt);

      errcode_t ec;
      skt.async_handshake(boost::asio::ssl::stream_base::server);
      self->match(ssl::as_handshake).recv(ec);
      GCE_VERIFY(!ec).except(ec);

      amsg::zero_copy_buffer zbuf;
      byte_t read_buff[256];
      std::deque<bytes_t> write_queue;

      echo_header hdr;
      size_t const hdr_len = amsg::size_of(hdr);
      match_t const recv_header = atom("header");
      match_t const recv_body = atom("body");

      skt.async_read(boost::asio::buffer(read_buff, hdr_len), message(recv_header));
      while (true)
      {
        match_t type;
        errcode_t ec;
        self->match(recv_header, recv_body, tcp::as_send, type).recv(ec);
        GCE_VERIFY(!ec).except(ec);

        if (type == recv_header)
        {
          zbuf.set_read(read_buff, hdr_len);
          amsg::read(zbuf, hdr);
          GCE_VERIFY(!zbuf.bad()).except<std::runtime_error>();

          skt.async_read(boost::asio::buffer(read_buff + hdr_len, hdr.size_), message(recv_body));
        }
        else if (type == recv_body)
        {
          zbuf.set_read(read_buff + hdr_len, hdr.size_);
          std::string str;
          amsg::read(zbuf, str);
          GCE_VERIFY(!zbuf.bad()).except<std::runtime_error>();

          //GCE_INFO(lg) << "server recved echo: " << str;
          if (str == "bye")
          {
            break;
          }

          bool write_in_progress = !write_queue.empty();
          write_queue.push_back(bytes_t(read_buff, hdr_len + hdr.size_));
          if (!write_in_progress)
          {
            bytes_t const& echo = write_queue.front();
            skt.async_write(boost::asio::buffer(echo.data(), echo.size()));
          }
          
          skt.async_read(boost::asio::buffer(read_buff, hdr_len), message(recv_header));
        }
        else
        {
          write_queue.pop_front();
          if (!write_queue.empty())
          {
            bytes_t const& echo = write_queue.front();
            skt.async_write(boost::asio::buffer(echo.data(), echo.size()));
          }
        }
      }

      skt.async_shutdown();
      self->match(ssl::as_shutdown).recv();
    }
    catch (std::exception& ex)
    {
      GCE_ERROR(lg) << ex.what();
    }
  }
示例#4
0
///----------------------------------------------------------------------------
gce::detail::socket_ptr acceptor::accept(yield_t yield)
{
  gce::tcp::socket_ptr skt(new socket(snd_.get_io_service()));
  acpr_.async_accept(skt->get_socket(), yield);
  return skt;
}