annotate C++/examples/Socket/stream-client.cpp @ 463:214f03b47d4e

Socket: - New action() and condition() function to check for pending events, - More documentation, - StreamServer, StreamClient can now complete recv/send operation for OpenSSL.
author David Demelier <markand@malikania.fr>
date Wed, 04 Nov 2015 18:01:22 +0100
parents
children 5a9671dabb15
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
463
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 * stream-server -- example of stream server
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Options:
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 * - WITH_PORT (int) which port to use (default: 12000)
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * - WITH_HOST (string literal) which host to connect (default: "localhost")
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * - WITH_SSL (bool) true to use SSL (default: false)
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 */
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
9
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 #include <iostream>
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
11
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 #include "Sockets.h"
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
13
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 #if !defined(WITH_PORT)
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 # define WITH_PORT 12000
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 #endif
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
17
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
18 #if !defined(WITH_HOST)
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 # define WITH_HOST "localhost"
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 #endif
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
21
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
22 #if defined(WITH_SSL)
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
23 using Client = net::StreamClient<net::Ipv4, net::Tls>;
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
24 #else
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
25 using Client = net::StreamClient<net::Ipv4, net::Tcp>;
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
26 #endif
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
27
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 int main()
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
29 {
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
30 Client client;
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
31
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 /*
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
33 * Unfortunately at the moment the socket state is not changed, this will be done
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
34 * in the future.
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
35 */
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
36 bool connected{true};
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
37
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
38 client.setConnectionHandler([&] () {
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
39 std::cout << "client: successfully connected" << std::endl;
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 client.send("Hello world!");
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
41 });
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
42 client.setDisconnectionHandler([&] () {
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
43 std::cout << "client: disconnected" << std::endl;
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
44 connected = false;
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
45 });
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
46 client.setErrorHandler([&] (const net::Error &error) {
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 std::cout << "client: error: " << error.function() << ": " << error.what() << std::endl;
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
48 connected = false;
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
49 });
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
50 client.setReadHandler([] (const std::string &data) {
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
51 std::cout << "client: received: " << data << std::endl;
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
52 });
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 client.setWriteHandler([] (const std::string &data) {
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
54 std::cout << "client: sent: " << data << std::endl;
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
55 });
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
56
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 client.connect(net::Ipv4{WITH_HOST, WITH_PORT});
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
58
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
59 while (connected) {
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
60 client.poll();
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
61 }
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
62
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
63 std::cout << "client: exiting" << std::endl;
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
64
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
65 return 0;
214f03b47d4e Socket:
David Demelier <markand@malikania.fr>
parents:
diff changeset
66 }