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
サーバ側:// 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;
}