Boost.に基づくasioの簡単な一対一同期チャットプログラム
本例で実現する機能は比較的簡単であり,TCP,すなわち接続された同期通信モードに基づいている.実行結果は、サーバ側プログラムを起動し、クライアントインスタンスを起動すると、サーバ側がクライアントにメッセージを送信することができ、クライアントが受信した後にサーバ側にメッセージを送信することができるというプロセスで、一方がコンテンツを「quit」と送信するまで簡単に「一言一言」で説明できます.
TCPベースの同期通信はここでの実装は複雑ではない(もちろん複雑には行われていないが、例えば、後でマルチスレッドを使用してサーバプログラムがクライアントの接続と転送メッセージのみを確立することを考慮することができるなどである.これらは後で徐々に実現される).プロセスは、以下のように簡単に説明できます.
サーバ側:
(1)ioの利用サービスとendpointはacceptorオブジェクトとsocketオブジェクトを構築します
(2)acceptorオブジェクトは、クライアントの接続を待つためにaccept関数を呼び出す
(3)メッセージの送受信のサイクルに入る
(4)終了条件が満たされた場合に終了
クライアント:
(1)ioの利用サービスはsocketオブジェクトを構築します
(2)socket呼び出しconnect関数endpointエンドポイント対応サーバ接続
(3)メッセージの送受信のサイクルに入る
(4)終了条件が満たされた場合に終了
実装コード:
本機プラットフォームはWindows XP SP 2+VS.net 2003+Boost 1.40.0
サーバ側:
TCPベースの同期通信はここでの実装は複雑ではない(もちろん複雑には行われていないが、例えば、後でマルチスレッドを使用してサーバプログラムがクライアントの接続と転送メッセージのみを確立することを考慮することができるなどである.これらは後で徐々に実現される).プロセスは、以下のように簡単に説明できます.
サーバ側:
(1)ioの利用サービスとendpointはacceptorオブジェクトとsocketオブジェクトを構築します
(2)acceptorオブジェクトは、クライアントの接続を待つためにaccept関数を呼び出す
(3)メッセージの送受信のサイクルに入る
(4)終了条件が満たされた場合に終了
クライアント:
(1)ioの利用サービスはsocketオブジェクトを構築します
(2)socket呼び出しconnect関数endpointエンドポイント対応サーバ接続
(3)メッセージの送受信のサイクルに入る
(4)終了条件が満たされた場合に終了
実装コード:
本機プラットフォームはWindows XP SP 2+VS.net 2003+Boost 1.40.0
サーバ側:
// Server.cpp
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0×0501
#endif
#include
#include
#include
using namespace boost::asio;
int main(int argc, char* argv[])
{
io_service iosev;
ip::tcp::acceptor acceptor(iosev,
ip::tcp::endpoint(ip::tcp::v4(), 8888));
// socket
ip::tcp::socket socket(iosev);
//
acceptor.accept(socket);
boost::system::error_code ec;
//
while (true)
{
std::string strMsg;
std::cout << "Server say: ";
std::getline(std::cin, strMsg);
socket.write_some(buffer(strMsg.c_str()), ec);
char buf[100];
size_t len=socket.read_some(buffer(buf), ec);
std::cout << "Client say: ";
std::cout.write(buf, len);
std::cout << std::endl;
std::string strTemp(buf);
std::string ifQuit = strTemp.substr(0, 4);
if ("quit" == ifQuit)
{
socket.write_some(buffer(ifQuit.c_str()), ec);
break;
}
}
// ,
if(ec)
{
std::cout << boost::system::system_error(ec).what() << std::endl;
return -1;
}
system("pause");
return 0;
}
:
// Client.cpp
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0×0501
#endif
#include
#include
#include
using namespace boost::asio;
int main(int argc, char* argv[])
{
io_service iosev;
ip::tcp::socket socket(iosev);
// , IP
ip::tcp::endpoint ep(ip::address_v4::from_string("127.0.0.1"), 8888);
boost::system::error_code ec;
//
socket.connect(ep,ec);
// ,
if(ec)
{
std::cout << boost::system::system_error(ec).what() << std::endl;
return -1;
}
//
while(true)
{
char buf[100];
size_t len=socket.read_some(buffer(buf), ec);
std::cout << "Server say: ";
std::cout.write(buf, len);
std::cout << std::endl;
std::string strTemp(buf);
std::string ifQuit = strTemp.substr(0, 4);
if ("quit" == ifQuit)
{
socket.write_some(buffer(ifQuit.c_str()), ec);
break;
}
std::string strMsg;
std::cout << "Client say: ";
std::getline(std::cin, strMsg);
socket.write_some(buffer(strMsg.c_str()), ec);
}
system("pause");
return 0;
}