458
|
1 /* |
|
2 * non-blocking-connect.cpp -- example of non blocking connect |
|
3 * |
|
4 * Options: |
|
5 * - WITH_HOST (string literal), the host to try (default: "malikania.fr") |
|
6 * - WITH_PORT (int), the port to use (default: 80) |
|
7 * - WITH_TIMEOUT (int), number of seconds before giving up (default: 30) |
|
8 * - WITH_SSL (bool), true to test with SSL (default: false) |
|
9 */ |
|
10 |
|
11 #include <iostream> |
|
12 |
|
13 #if !defined(WITH_HOST) |
|
14 # define WITH_HOST "malikania.fr" |
|
15 #endif |
|
16 |
|
17 #if !defined(WITH_PORT) |
|
18 # define WITH_PORT 80 |
|
19 #endif |
|
20 |
|
21 #if !defined(WITH_TIMEOUT) |
|
22 # define WITH_TIMEOUT 30 |
|
23 #endif |
|
24 |
461
|
25 #include "ElapsedTimer.h" |
458
|
26 #include "Sockets.h" |
|
27 |
|
28 int main() |
|
29 { |
|
30 #if defined(WITH_SSL) |
473
|
31 net::SocketTls<net::address::Ip> socket; |
458
|
32 #else |
473
|
33 net::SocketTcp<net::address::Ip> socket; |
458
|
34 #endif |
|
35 |
|
36 net::Listener<> listener; |
|
37 ElapsedTimer timer; |
|
38 |
473
|
39 // 1. Set to non-blocking. |
|
40 socket.set(net::option::SockBlockMode{false}); |
458
|
41 |
459
|
42 try { |
|
43 std::cout << "Trying to connect to " << WITH_HOST << ":" << WITH_PORT << std::endl; |
473
|
44 |
|
45 // 2. Initial connection process. |
|
46 socket.connect(net::address::Ip{WITH_HOST, WITH_PORT}); |
459
|
47 |
|
48 while (socket.state() != net::State::Connected) { |
458
|
49 listener.remove(socket.handle()); |
|
50 |
473
|
51 // 2. Now complete by waiting for the appropriate condition. |
|
52 listener.set(socket.handle(), socket.condition()); |
459
|
53 listener.wait(std::chrono::seconds(WITH_TIMEOUT)); |
|
54 socket.connect(); |
458
|
55 } |
459
|
56 } catch (const net::Error &error) { |
473
|
57 std::cerr << "error: " << error.what() << std::endl; |
459
|
58 std::exit(1); |
458
|
59 } |
|
60 |
461
|
61 if (socket.state() == net::State::Connected) { |
|
62 std::cout << "Successfully connected!" << std::endl; |
|
63 } |
458
|
64 |
|
65 return 0; |
|
66 } |