2012-03-30 12 views
4

タイトルは私の質問です。SSLを使用しないSSLソケットでの読み書き方法を強化するには?

私はすでにここにこれに関連するトピックを見つける - >Using SSL sockets and non-SSL sockets simultaneously in Boost.Asio?
をし、基本的に私は同じような状況にいるが、私はこれをやっているので、何らかの理由で、私はそこにコメント、および/または直接質問者に連絡ができませんでした新しい質問として

私は、クライアントが

socket_.async_handshake(ssl::stream_base::server, session::handle_handshake) 

でうまく接続し、

async_write(socket_, buffer(send_data, send_length), session::handle_read) 
socket_.async_read_some(buffer(recieved_data, max_length), session::handle_read) 

で読み取り/書き込み可能に設定SSLソケットssl::stream<ip::tcp::socket> socket_;を持っているしかし、今、私はソケットの同じタイプを使用したいですSSLを使用しない接続を構築します。

まず、上記のようにSSL接続で行われるように "ハンドシェイク"を行う方法がわかりません。
普通のboost.asioの例を見ると、非SSL接続の場合はそれをしなくても、受け入れられたらソケットに直接読み書きできると仮定します。

次に、上記のトピックで説明したようにして、SSL接続の有無を確認するために、セッションにブール値のsslを追加しました。
次に、非同期機能でsocket_を使用する代わりに、socket_.lowest_layer()を使用しました。コンパイラは、このソリューションを受け入れるdoes notのようですが

if (sslEnabled) 
    boost::asio::async_write(secureSocket_); 
} else { 
    boost::asio::async_write(secureSocket_.lowest_layer()); 
} 

は、ここで提案したコードです。私はこのエラーが現れるストリームとしてsocket_.lowest_layerを()は非同期機能を使用してコードをコンパイルしようとすると(のみasync_readため、async_writeは同様のものを持っているその):

boost\asio\impl\read.hpp(263): error C2039: 'async_read_some' : is not a member of 'boost::asio::basic_socket<Protocol,SocketService>' 
      with 
      [ 
       Protocol=boost::asio::ip::tcp, 
       SocketService=boost::asio::stream_socket_service<boost::asio::ip::tcp> 
      ] 
      boost\asio\impl\read.hpp(255) : while compiling class template member function 'void boost::asio::detail::read_op<AsyncReadStream,MutableBufferSequence,CompletionCondition,ReadHandler>::operator()(const boost::system::error_code &,size_t,int)' 
      with 
      [ 
      AsyncReadStream=boost::asio::basic_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp>>, 
       MutableBufferSequence=boost::asio::mutable_buffers_1, 
       CompletionCondition=boost::asio::detail::transfer_all_t, 
       ReadHandler=boost::_bi::bind_t<void,boost::_mfi::mf2<void,CSocket,const boost::system::error_code &,size_t>,boost::_bi::list3<boost::_bi::value<CSocket *>,boost::arg<1>,boost::arg<2>>> 
      ] 
      boost\asio\impl\read.hpp(527) : see reference to class template instantiation 'boost::asio::detail::read_op<AsyncReadStream,MutableBufferSequence,CompletionCondition,ReadHandler>' being compiled 
      with 
      [ 
       AsyncReadStream=boost::asio::basic_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp>>, 
       MutableBufferSequence=boost::asio::mutable_buffers_1, 
       CompletionCondition=boost::asio::detail::transfer_all_t, 
       ReadHandler=boost::_bi::bind_t<void,boost::_mfi::mf2<void,CSocket,const boost::system::error_code &,size_t>,boost::_bi::list3<boost::_bi::value<CSocket *>,boost::arg<1>,boost::arg<2>>> 
      ] 
      c:\asio_test\source\server.cpp(131) : see reference to function template instantiation 'void boost::asio::async_read<boost::asio::basic_socket<Protocol,SocketService>,boost::asio::mutable_buffers_1,boost::_bi::bind_t<R,F,L>>(AsyncReadStream &,const MutableBufferSequence &,const ReadHandler &)' being compiled 
      with 
      [ 
       Protocol=boost::asio::ip::tcp, 
       SocketService=boost::asio::stream_socket_service<boost::asio::ip::tcp>, 
       R=void, 
       F=boost::_mfi::mf2<void,CSocket,const boost::system::error_code &,size_t>, 
       L=boost::_bi::list3<boost::_bi::value<CSocket *>,boost::arg<1>,boost::arg<2>>, 
       AsyncReadStream=boost::asio::basic_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp>>, 
       MutableBufferSequence=boost::asio::mutable_buffers_1, 
       ReadHandler=boost::_bi::bind_t<void,boost::_mfi::mf2<void,CSocket,const boost::system::error_code &,size_t>,boost::_bi::list3<boost::_bi::value<CSocket *>,boost::arg<1>,boost::arg<2>>> 
      ] 

Build FAILED. 

をだから今私は私はあなたが私を助けることを願っています。エラーを検索すると何も起こらなかったし、おそらく動作するはずなので、間違いが何であるかわからない...

答えて

8

実際に私はそれを今解決したと思う。非SSLの

1)「ハンドシェイク」は確かに必要はありません

2を受け入れた後、私はすぐにasync_readingを行う)の代わりにasync_read/write(socket_.lowest_layer(), ...)の私はまだsocket_.next_layer().async_read_some(buffer, handler)
async_write(socket_.next_layer(), ...)

を使用していましたなぜそれがsocket_.lowest_layer()で動作しないのか分かりませんが(誰かが分かっているなら、説明してください)、少なくとも上の方法でうまくいきます。そして、これが同様の問題を抱える他の人にも役立つことを願っています;-)

関連する問題