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 件のコメント:
コメントを投稿