読者です 読者をやめる 読者になる 読者になる

堕(惰)プログラマ開発記録

タイトル変えようかなとも思ってるけれど,思い浮かばない

Boost.Asioによる非同期通信

C++ Boost

OAuth関連のコードを最近書いてるはずなのに、
同期通信しか出来ないという俺だったので、
非同期通信について調べながらやってみた。


ゆうと(@yutopp)さんに
「workを作って、io_service::runをスレッドにぶち込めばもうそれだけで非同期」
と教わったのでそれを頼りに色々探してみた。


一応非同期と思われるコードは以下。

#include <iostream>
#include <boost/asio.hpp>
#include <boost/thread/thread.hpp>
#include <boost/bind.hpp>

void write_callback(const boost::system::error_code& e, std::size_t size )
{
  std::cout << "write :" << size << "byte[s]" << std::endl;
}

int main(){
  //通信関連の用意
  boost::asio::io_service io_service;
  boost::asio::ip::tcp::socket socket(io_service);
  boost::asio::io_service::work work(io_service); //workを作成
  boost::asio::ip::tcp::resolver resolver(io_service);
  boost::asio::ip::tcp::resolver::query query("godai.e-whs.net","http");

  boost::asio::ip::tcp::resolver::iterator pos = resolver.resolve(query);
  boost::asio::ip::tcp::resolver::iterator last;
  boost::system::error_code error;
  while(error && pos != last){
    socket.close();
    socket.connect(*pos++,error);
  }

  //HTTPリクエストの作成
  boost::asio::streambuf buffer;
  std::ostream ss(&buffer);
  ss << "GET / HTTP/1.1\r\n";
  ss <<"Host: godai.e-whs.net\r\n";
  ss << "Connection: Keep-Alive\r\n\r\n";
  ss << std::flush;

  //スレッドにio_service::runをぶち込んでみた
  boost::thread thread(boost::bind(&boost::asio::io_service::run,&io_service));

  //非同期通信と思われるリクエスト送信
  boost::asio::async_write(
    socket,
    buffer,
    boost::bind(&write_callback,_1,_2)
  );

  //レスポンス読み取り
  //これも非同期にした方が良いのかな、などと
  while(boost::asio::read(socket,buffer,boost::asio::transfer_at_least(1), error));
  std::string res = static_cast<std::string>(boost::asio::buffer_cast<const char*>(buffer.data()));

  return 0;
}


お粗末様です。
合ってるかどうか解らないけど、一応出来たとこまで。
色々変なところとか有りましたら、コメントくれると嬉しいです。


にしても、2時間でこれとか、悲しい限りだわ…