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) |
|
31 net::SocketTls<net::Ipv4> socket; |
|
32 #else |
|
33 net::SocketTcp<net::Ipv4> socket; |
|
34 #endif |
|
35 |
|
36 net::Listener<> listener; |
|
37 ElapsedTimer timer; |
|
38 |
|
39 socket.setBlockMode(false); |
|
40 |
459
|
41 try { |
|
42 std::cout << "Trying to connect to " << WITH_HOST << ":" << WITH_PORT << std::endl; |
|
43 socket.connect(net::Ipv4{WITH_HOST, WITH_PORT}); |
|
44 |
|
45 while (socket.state() != net::State::Connected) { |
458
|
46 listener.remove(socket.handle()); |
|
47 |
459
|
48 if (socket.state() == net::State::ConnectingRead) { |
458
|
49 listener.set(socket.handle(), net::FlagRead); |
459
|
50 } else if (socket.state() == net::State::ConnectingWrite) { |
458
|
51 listener.set(socket.handle(), net::FlagWrite); |
|
52 } |
|
53 |
459
|
54 listener.wait(std::chrono::seconds(WITH_TIMEOUT)); |
|
55 socket.connect(); |
458
|
56 } |
459
|
57 } catch (const net::Error &error) { |
|
58 if (error.code() == net::Error::Timeout) { |
|
59 std::cerr << "timeout while connecting" << std::endl; |
|
60 } else { |
|
61 std::cerr << "error: " << error.what() << std::endl; |
|
62 } |
|
63 |
|
64 std::exit(1); |
458
|
65 } |
|
66 |
461
|
67 if (socket.state() == net::State::Connected) { |
|
68 std::cout << "Successfully connected!" << std::endl; |
|
69 } |
458
|
70 |
|
71 return 0; |
|
72 } |