2011年11月8日火曜日

BOOST::ASIOを使ってみる(1)

C++とBoostの勉強のため、Boost::Asioを使ってみたいと思います。おかしな部分も多いので、ご指摘頂けると嬉しいです。
Boostのインストール等は省略します。環境は以下です。

-WindowsXP
-Boost1.47.0

BoostのAsioはネットワークやローレベルのIOを扱うための同期・非同期モデルです。これを使えば、同期・非同期でのネットワーク処理などが行えます。
(# http://www.boost.org/doc/libs/1_47_0/doc/html/boost_asio.html

まずは簡単なものから作りたいので、文字を打ったらエコーバックするだけのものを作りたいと思います。

以下ソースコードです。

ServerModule.hpp

#pragma once

#ifndef __ASIO_SERVER_MODULE__
#define __ASIO_SERVER_MODULE__

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

namespace thorny_road{

using namespace boost::asio ;

class ServerModule : public boost::noncopyable
{
private:
    io_service& io ;
    ip::tcp::acceptor accept ;
    ip::tcp::iostream buf ;
public:
    
    ServerModule(io_service& io, const short port)
        :io(io),accept(io,ip::tcp::endpoint(ip::tcp::v4(),port))
    {
        start_accept() ;
    }

    void start_accept()
    {
        accept.accept( *buf.rdbuf() ) ;
        std::string tmp ;
        buf >> tmp ; // get input stream
        buf << tmp <<std::endl ; // retrun as it is
    }


} ;

} // namespace snb
#endif //__ASIO_SERVER_MODULE__


Main.cpp
#include "stdafx.h"
#include "ServerModule.hpp"

#include <boost/asio.hpp>

using namespace thorny_road ;

int _tmain(int argc, _TCHAR* argv[])
{
    boost::asio::io_service io ;

    ServerModule svr(io,2085) ; // Start Server Module

    return 0;
}

勉強を兼ねてServerはクラスで構築しました。また、ヘッダーファイルにコードを書いています。その方が何かと載せやすいというのと、DELPHIもよく使うため慣れているからです。

まず最初にio_serviceを作成します。それを引数にServerModuleのインスタンスを作成しています。ServerModuleのコンストラクタが呼ばれると、start_accept()関数が呼ばれて接続待ちになります。accept(...)は同期処理になるので、接続が来るまで待つことになります。

これを実行すると、インプット待ち状態になります。
以下のようにTelnetでアクセスすると、接続できるようになります。
telnet localhost 2085

簡単にネットワークのプログラムが書けました。Boostは便利ですね。

次は非同期処理に挑戦したいですね。

ソースコードはご自由に使用ください。ただし、問題が起きても責任は取りません。

0 件のコメント:

コメントを投稿