~ubuntu-branches/ubuntu/intrepid/asio/intrepid

« back to all changes in this revision

Viewing changes to doc/examples/chat_chat_client_cpp.html

  • Committer: Bazaar Package Importer
  • Author(s): Simon Richter
  • Date: 2007-09-07 11:10:41 UTC
  • Revision ID: james.westby@ubuntu.com-20070907111041-f0uwhs0llvzj9ah5
Tags: upstream-0.3.8~rc3
ImportĀ upstreamĀ versionĀ 0.3.8~rc3

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
<HTML>
 
2
  <HEAD>
 
3
    <TITLE>asio Examples: chat/chat_client.cpp</TITLE>
 
4
    <LINK HREF="asio.css" REL="stylesheet" TYPE="text/css">
 
5
    <LINK HREF="tabs.css" REL="stylesheet" TYPE="text/css">
 
6
  </HEAD>
 
7
  <BODY BGCOLOR="#FFFFFF">
 
8
    <DIV CLASS="qindex">
 
9
      <TABLE BORDER="0" WIDTH="100%">
 
10
        <TR>
 
11
          <TD ALIGN="LEFT">
 
12
            <B>asio 0.3.8rc3</B>
 
13
          </TD>
 
14
          <TD ALIGN="RIGHT">
 
15
            <A CLASS="qindex" HREF="../index.html">Home</A> |
 
16
            <A CLASS="qindex" HREF="../reference/index.html">Reference</A> |
 
17
            <A CLASS="qindex" HREF="../tutorial/index.html">Tutorial</A> |
 
18
            <A CLASS="qindex" HREF="../examples/index.html">Examples</A> |
 
19
            <A CLASS="qindex" HREF="../design/index.html">Design</A>
 
20
          </TD>
 
21
        </TR>
 
22
      </TABLE>
 
23
    </DIV>
 
24
    <DIV CLASS="qindex">
 
25
      <TABLE BORDER="0" WIDTH="100%">
 
26
        <TR>
 
27
          <TD ALIGN="LEFT">
 
28
            <B>Examples</B>
 
29
          </TD>
 
30
          <TD ALIGN="RIGHT">
 
31
          </TD>
 
32
        </TR>
 
33
      </TABLE>
 
34
    </DIV>
 
35
<!-- Generated by Doxygen 1.5.1 -->
 
36
<h1><a class="anchor" name="chat_chat_client_cpp">chat/chat_client.cpp</a></h1><div class="fragment"><pre class="fragment"><span class="comment">//</span>
 
37
<span class="comment">// chat_client.cpp</span>
 
38
<span class="comment">// ~~~~~~~~~~~~~~~</span>
 
39
<span class="comment">//</span>
 
40
<span class="comment">// Copyright (c) 2003-2007 Christopher M. Kohlhoff (chris at kohlhoff dot com)</span>
 
41
<span class="comment">//</span>
 
42
<span class="comment">// Distributed under the Boost Software License, Version 1.0. (See accompanying</span>
 
43
<span class="comment">// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)</span>
 
44
<span class="comment">//</span>
 
45
 
 
46
<span class="preprocessor">#include &lt;cstdlib&gt;</span>
 
47
<span class="preprocessor">#include &lt;deque&gt;</span>
 
48
<span class="preprocessor">#include &lt;iostream&gt;</span>
 
49
<span class="preprocessor">#include &lt;boost/bind.hpp&gt;</span>
 
50
<span class="preprocessor">#include "asio.hpp"</span>
 
51
<span class="preprocessor">#include "chat_message.hpp"</span>
 
52
 
 
53
<span class="keyword">using</span> <a class="codeRef" doxygen="asio.doxytags:../reference/" href="../reference/a00051.html">asio::ip::tcp</a>;
 
54
 
 
55
<span class="keyword">typedef</span> std::deque&lt;chat_message&gt; chat_message_queue;
 
56
 
 
57
<span class="keyword">class </span>chat_client
 
58
{
 
59
<span class="keyword">public</span>:
 
60
  chat_client(<a class="codeRef" doxygen="asio.doxytags:../reference/" href="../reference/a00032.html">asio::io_service</a>&amp; io_service,
 
61
      tcp::resolver::iterator endpoint_iterator)
 
62
    : io_service_(io_service),
 
63
      socket_(io_service)
 
64
  {
 
65
    tcp::endpoint endpoint = *endpoint_iterator;
 
66
    socket_.async_connect(endpoint,
 
67
        boost::bind(&amp;chat_client::handle_connect, <span class="keyword">this</span>,
 
68
          <a class="codeRef" doxygen="asio.doxytags:../reference/" href="../reference/a00131.html#441d03324a306a3f2e2c4c72485fdf4e">asio::placeholders::error</a>, ++endpoint_iterator));
 
69
  }
 
70
 
 
71
  <span class="keywordtype">void</span> <a class="codeRef" doxygen="asio.doxytags:../reference/" href="../reference/a00140.html#ggac57e38176c76b4323e69341f18ff8b3">write</a>(<span class="keyword">const</span> chat_message&amp; msg)
 
72
  {
 
73
    io_service_.post(boost::bind(&amp;chat_client::do_write, <span class="keyword">this</span>, msg));
 
74
  }
 
75
 
 
76
  <span class="keywordtype">void</span> close()
 
77
  {
 
78
    io_service_.post(boost::bind(&amp;chat_client::do_close, <span class="keyword">this</span>));
 
79
  }
 
80
 
 
81
<span class="keyword">private</span>:
 
82
 
 
83
  <span class="keywordtype">void</span> handle_connect(<span class="keyword">const</span> <a class="codeRef" doxygen="asio.doxytags:../reference/" href="../reference/a00030.html">asio::error_code</a>&amp; error,
 
84
      tcp::resolver::iterator endpoint_iterator)
 
85
  {
 
86
    <span class="keywordflow">if</span> (!error)
 
87
    {
 
88
      <a class="codeRef" doxygen="asio.doxytags:../reference/" href="../reference/a00137.html#gb1d5925953621f0ba652f8b158eb4687">asio::async_read</a>(socket_,
 
89
          <a class="codeRef" doxygen="asio.doxytags:../reference/" href="../reference/a00134.html#g1ed66e401559cbfd19595392f653b47c">asio::buffer</a>(read_msg_.data(), chat_message::header_length),
 
90
          boost::bind(&amp;chat_client::handle_read_header, <span class="keyword">this</span>,
 
91
            <a class="codeRef" doxygen="asio.doxytags:../reference/" href="../reference/a00131.html#441d03324a306a3f2e2c4c72485fdf4e">asio::placeholders::error</a>));
 
92
    }
 
93
    <span class="keywordflow">else</span> <span class="keywordflow">if</span> (endpoint_iterator != tcp::resolver::iterator())
 
94
    {
 
95
      socket_.close();
 
96
      tcp::endpoint endpoint = *endpoint_iterator;
 
97
      socket_.async_connect(endpoint,
 
98
          boost::bind(&amp;chat_client::handle_connect, <span class="keyword">this</span>,
 
99
            <a class="codeRef" doxygen="asio.doxytags:../reference/" href="../reference/a00131.html#441d03324a306a3f2e2c4c72485fdf4e">asio::placeholders::error</a>, ++endpoint_iterator));
 
100
    }
 
101
  }
 
102
 
 
103
  <span class="keywordtype">void</span> handle_read_header(<span class="keyword">const</span> <a class="codeRef" doxygen="asio.doxytags:../reference/" href="../reference/a00030.html">asio::error_code</a>&amp; error)
 
104
  {
 
105
    <span class="keywordflow">if</span> (!error &amp;&amp; read_msg_.decode_header())
 
106
    {
 
107
      <a class="codeRef" doxygen="asio.doxytags:../reference/" href="../reference/a00137.html#gb1d5925953621f0ba652f8b158eb4687">asio::async_read</a>(socket_,
 
108
          <a class="codeRef" doxygen="asio.doxytags:../reference/" href="../reference/a00134.html#g1ed66e401559cbfd19595392f653b47c">asio::buffer</a>(read_msg_.body(), read_msg_.body_length()),
 
109
          boost::bind(&amp;chat_client::handle_read_body, <span class="keyword">this</span>,
 
110
            <a class="codeRef" doxygen="asio.doxytags:../reference/" href="../reference/a00131.html#441d03324a306a3f2e2c4c72485fdf4e">asio::placeholders::error</a>));
 
111
    }
 
112
    <span class="keywordflow">else</span>
 
113
    {
 
114
      do_close();
 
115
    }
 
116
  }
 
117
 
 
118
  <span class="keywordtype">void</span> handle_read_body(<span class="keyword">const</span> <a class="codeRef" doxygen="asio.doxytags:../reference/" href="../reference/a00030.html">asio::error_code</a>&amp; error)
 
119
  {
 
120
    <span class="keywordflow">if</span> (!error)
 
121
    {
 
122
      std::cout.write(read_msg_.body(), read_msg_.body_length());
 
123
      std::cout &lt;&lt; <span class="stringliteral">"\n"</span>;
 
124
      <a class="codeRef" doxygen="asio.doxytags:../reference/" href="../reference/a00137.html#gb1d5925953621f0ba652f8b158eb4687">asio::async_read</a>(socket_,
 
125
          <a class="codeRef" doxygen="asio.doxytags:../reference/" href="../reference/a00134.html#g1ed66e401559cbfd19595392f653b47c">asio::buffer</a>(read_msg_.data(), chat_message::header_length),
 
126
          boost::bind(&amp;chat_client::handle_read_header, <span class="keyword">this</span>,
 
127
            <a class="codeRef" doxygen="asio.doxytags:../reference/" href="../reference/a00131.html#441d03324a306a3f2e2c4c72485fdf4e">asio::placeholders::error</a>));
 
128
    }
 
129
    <span class="keywordflow">else</span>
 
130
    {
 
131
      do_close();
 
132
    }
 
133
  }
 
134
 
 
135
  <span class="keywordtype">void</span> do_write(chat_message msg)
 
136
  {
 
137
    <span class="keywordtype">bool</span> write_in_progress = !write_msgs_.empty();
 
138
    write_msgs_.push_back(msg);
 
139
    <span class="keywordflow">if</span> (!write_in_progress)
 
140
    {
 
141
      <a class="codeRef" doxygen="asio.doxytags:../reference/" href="../reference/a00141.html#g1747d3ec27f952154952e23be9249fbc">asio::async_write</a>(socket_,
 
142
          <a class="codeRef" doxygen="asio.doxytags:../reference/" href="../reference/a00134.html#g1ed66e401559cbfd19595392f653b47c">asio::buffer</a>(write_msgs_.front().data(),
 
143
            write_msgs_.front().length()),
 
144
          boost::bind(&amp;chat_client::handle_write, <span class="keyword">this</span>,
 
145
            <a class="codeRef" doxygen="asio.doxytags:../reference/" href="../reference/a00131.html#441d03324a306a3f2e2c4c72485fdf4e">asio::placeholders::error</a>));
 
146
    }
 
147
  }
 
148
 
 
149
  <span class="keywordtype">void</span> handle_write(<span class="keyword">const</span> <a class="codeRef" doxygen="asio.doxytags:../reference/" href="../reference/a00030.html">asio::error_code</a>&amp; error)
 
150
  {
 
151
    <span class="keywordflow">if</span> (!error)
 
152
    {
 
153
      write_msgs_.pop_front();
 
154
      <span class="keywordflow">if</span> (!write_msgs_.empty())
 
155
      {
 
156
        <a class="codeRef" doxygen="asio.doxytags:../reference/" href="../reference/a00141.html#g1747d3ec27f952154952e23be9249fbc">asio::async_write</a>(socket_,
 
157
            <a class="codeRef" doxygen="asio.doxytags:../reference/" href="../reference/a00134.html#g1ed66e401559cbfd19595392f653b47c">asio::buffer</a>(write_msgs_.front().data(),
 
158
              write_msgs_.front().length()),
 
159
            boost::bind(&amp;chat_client::handle_write, <span class="keyword">this</span>,
 
160
              <a class="codeRef" doxygen="asio.doxytags:../reference/" href="../reference/a00131.html#441d03324a306a3f2e2c4c72485fdf4e">asio::placeholders::error</a>));
 
161
      }
 
162
    }
 
163
    <span class="keywordflow">else</span>
 
164
    {
 
165
      do_close();
 
166
    }
 
167
  }
 
168
 
 
169
  <span class="keywordtype">void</span> do_close()
 
170
  {
 
171
    socket_.close();
 
172
  }
 
173
 
 
174
<span class="keyword">private</span>:
 
175
  <a class="codeRef" doxygen="asio.doxytags:../reference/" href="../reference/a00032.html">asio::io_service</a>&amp; io_service_;
 
176
  tcp::socket socket_;
 
177
  chat_message read_msg_;
 
178
  chat_message_queue write_msgs_;
 
179
};
 
180
 
 
181
<span class="keywordtype">int</span> <a class="code" href="a00033.html#0ddf1224851353fc92bfbff6f499fa97">main</a>(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span>* argv[])
 
182
{
 
183
  <span class="keywordflow">try</span>
 
184
  {
 
185
    <span class="keywordflow">if</span> (argc != 3)
 
186
    {
 
187
      std::cerr &lt;&lt; <span class="stringliteral">"Usage: chat_client &lt;host&gt; &lt;port&gt;\n"</span>;
 
188
      <span class="keywordflow">return</span> 1;
 
189
    }
 
190
 
 
191
    <a class="codeRef" doxygen="asio.doxytags:../reference/" href="../reference/a00032.html">asio::io_service</a> io_service;
 
192
 
 
193
    tcp::resolver resolver(io_service);
 
194
    tcp::resolver::query query(argv[1], argv[2]);
 
195
    tcp::resolver::iterator iterator = resolver.resolve(query);
 
196
 
 
197
    chat_client c(io_service, iterator);
 
198
 
 
199
    <a class="codeRef" doxygen="asio.doxytags:../reference/" href="../reference/a00052.html">asio::thread</a> t(boost::bind(&amp;<a class="codeRef" doxygen="asio.doxytags:../reference/" href="../reference/a00032.html#c84bed0d1dd061bc71010ba1228439da">asio::io_service::run</a>, &amp;io_service));
 
200
 
 
201
    <span class="keywordtype">char</span> line[chat_message::max_body_length + 1];
 
202
    <span class="keywordflow">while</span> (std::cin.getline(line, chat_message::max_body_length + 1))
 
203
    {
 
204
      <span class="keyword">using namespace </span>std; <span class="comment">// For strlen and memcpy.</span>
 
205
      chat_message msg;
 
206
      msg.body_length(strlen(line));
 
207
      memcpy(msg.body(), line, msg.body_length());
 
208
      msg.encode_header();
 
209
      c.write(msg);
 
210
    }
 
211
 
 
212
    c.close();
 
213
    t.join();
 
214
  }
 
215
  <span class="keywordflow">catch</span> (std::exception&amp; e)
 
216
  {
 
217
    std::cerr &lt;&lt; <span class="stringliteral">"Exception: "</span> &lt;&lt; e.what() &lt;&lt; <span class="stringliteral">"\n"</span>;
 
218
  }
 
219
 
 
220
  <span class="keywordflow">return</span> 0;
 
221
}
 
222
</pre></div>     <DIV CLASS="qindex">
 
223
      <TABLE BORDER="0" WIDTH="100%">
 
224
        <TR>
 
225
          <TD ALIGN="LEFT">
 
226
            <B>asio 0.3.8rc3</B>
 
227
          </TD>
 
228
          <TD ALIGN="RIGHT">
 
229
            <A CLASS="qindex" HREF="../index.html">Home</A> |
 
230
            <A CLASS="qindex" HREF="../reference/index.html">Reference</A> |
 
231
            <A CLASS="qindex" HREF="../tutorial/index.html">Tutorial</A> |
 
232
            <A CLASS="qindex" HREF="../examples/index.html">Examples</A> |
 
233
            <A CLASS="qindex" HREF="../design/index.html">Design</A>
 
234
          </TD>
 
235
        </TR>
 
236
      </TABLE>
 
237
    </DIV>
 
238
  </BODY>
 
239
</HTML>