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">
7
<BODY BGCOLOR="#FFFFFF">
9
<TABLE BORDER="0" WIDTH="100%">
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>
25
<TABLE BORDER="0" WIDTH="100%">
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>
46
<span class="preprocessor">#include <cstdlib></span>
47
<span class="preprocessor">#include <deque></span>
48
<span class="preprocessor">#include <iostream></span>
49
<span class="preprocessor">#include <boost/bind.hpp></span>
50
<span class="preprocessor">#include "asio.hpp"</span>
51
<span class="preprocessor">#include "chat_message.hpp"</span>
53
<span class="keyword">using</span> <a class="codeRef" doxygen="asio.doxytags:../reference/" href="../reference/a00051.html">asio::ip::tcp</a>;
55
<span class="keyword">typedef</span> std::deque<chat_message> chat_message_queue;
57
<span class="keyword">class </span>chat_client
59
<span class="keyword">public</span>:
60
chat_client(<a class="codeRef" doxygen="asio.doxytags:../reference/" href="../reference/a00032.html">asio::io_service</a>& io_service,
61
tcp::resolver::iterator endpoint_iterator)
62
: io_service_(io_service),
65
tcp::endpoint endpoint = *endpoint_iterator;
66
socket_.async_connect(endpoint,
67
boost::bind(&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));
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& msg)
73
io_service_.post(boost::bind(&chat_client::do_write, <span class="keyword">this</span>, msg));
76
<span class="keywordtype">void</span> close()
78
io_service_.post(boost::bind(&chat_client::do_close, <span class="keyword">this</span>));
81
<span class="keyword">private</span>:
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>& error,
84
tcp::resolver::iterator endpoint_iterator)
86
<span class="keywordflow">if</span> (!error)
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(&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>));
93
<span class="keywordflow">else</span> <span class="keywordflow">if</span> (endpoint_iterator != tcp::resolver::iterator())
96
tcp::endpoint endpoint = *endpoint_iterator;
97
socket_.async_connect(endpoint,
98
boost::bind(&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));
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>& error)
105
<span class="keywordflow">if</span> (!error && read_msg_.decode_header())
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(&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>));
112
<span class="keywordflow">else</span>
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>& error)
120
<span class="keywordflow">if</span> (!error)
122
std::cout.write(read_msg_.body(), read_msg_.body_length());
123
std::cout << <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(&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>));
129
<span class="keywordflow">else</span>
135
<span class="keywordtype">void</span> do_write(chat_message msg)
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)
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(&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>));
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>& error)
151
<span class="keywordflow">if</span> (!error)
153
write_msgs_.pop_front();
154
<span class="keywordflow">if</span> (!write_msgs_.empty())
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(&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>));
163
<span class="keywordflow">else</span>
169
<span class="keywordtype">void</span> do_close()
174
<span class="keyword">private</span>:
175
<a class="codeRef" doxygen="asio.doxytags:../reference/" href="../reference/a00032.html">asio::io_service</a>& io_service_;
177
chat_message read_msg_;
178
chat_message_queue write_msgs_;
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[])
183
<span class="keywordflow">try</span>
185
<span class="keywordflow">if</span> (argc != 3)
187
std::cerr << <span class="stringliteral">"Usage: chat_client <host> <port>\n"</span>;
188
<span class="keywordflow">return</span> 1;
191
<a class="codeRef" doxygen="asio.doxytags:../reference/" href="../reference/a00032.html">asio::io_service</a> io_service;
193
tcp::resolver resolver(io_service);
194
tcp::resolver::query query(argv[1], argv[2]);
195
tcp::resolver::iterator iterator = resolver.resolve(query);
197
chat_client c(io_service, iterator);
199
<a class="codeRef" doxygen="asio.doxytags:../reference/" href="../reference/a00052.html">asio::thread</a> t(boost::bind(&<a class="codeRef" doxygen="asio.doxytags:../reference/" href="../reference/a00032.html#c84bed0d1dd061bc71010ba1228439da">asio::io_service::run</a>, &io_service));
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))
204
<span class="keyword">using namespace </span>std; <span class="comment">// For strlen and memcpy.</span>
206
msg.body_length(strlen(line));
207
memcpy(msg.body(), line, msg.body_length());
215
<span class="keywordflow">catch</span> (std::exception& e)
217
std::cerr << <span class="stringliteral">"Exception: "</span> << e.what() << <span class="stringliteral">"\n"</span>;
220
<span class="keywordflow">return</span> 0;
222
</pre></div> <DIV CLASS="qindex">
223
<TABLE BORDER="0" WIDTH="100%">
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>