diff options
Diffstat (limited to 'ACE/examples/APG/Sockets/Basic_Robust.cpp')
-rw-r--r-- | ACE/examples/APG/Sockets/Basic_Robust.cpp | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/ACE/examples/APG/Sockets/Basic_Robust.cpp b/ACE/examples/APG/Sockets/Basic_Robust.cpp new file mode 100644 index 00000000000..361519a4486 --- /dev/null +++ b/ACE/examples/APG/Sockets/Basic_Robust.cpp @@ -0,0 +1,137 @@ +// $Id$ + +#include "ace/OS_NS_errno.h" +#include "ace/INET_Addr.h" +#include "ace/SOCK_Stream.h" +#include "ace/SOCK_Connector.h" +#include "ace/Log_Msg.h" +#include "ace/Time_Value.h" + +int ACE_TMAIN (int, ACE_TCHAR *[]) +{ + /* + * Here we will use the default ctor and the set() + * method to configure it. After each set() we will + * display the address as a string and then connect + * to each respective server. We can reuse the addr + * instance once connection has been established. + * + // Listing 1 code/ch06 + ACE_INET_Addr addr; + ... + addr.set ("HAStatus", ACE_LOCALHOST); + ... + addr.set ("HALog", ACE_LOCALHOST); + // Listing 1 + * + */ + + ACE_INET_Addr addr; + ACE_TCHAR peerAddress[64]; + + // Listing 2 code/ch06 + addr.set (ACE_TEXT("HAStatus"), ACE_LOCALHOST); + if (addr.addr_to_string (peerAddress, + sizeof(peerAddress), 0) == 0) + { + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT ("(%P|%t) Connecting to %s\n"), + peerAddress)); + } + // Listing 2 + + // Listing 3 code/ch06 + ACE_SOCK_Stream status; + ACE_OS::last_error(0); + ACE_SOCK_Connector statusConnector (status, addr); + if (ACE_OS::last_error()) + ACE_ERROR_RETURN ((LM_ERROR, + ACE_TEXT ("%p\n"), + ACE_TEXT ("status")), 100); + // Listing 3 + + addr.set (ACE_TEXT("HALog"), ACE_LOCALHOST); + if (addr.addr_to_string (peerAddress, + sizeof(peerAddress), 0) == 0) + { + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT ("(%P|%t) Connecting to %s\n"), + peerAddress )); + } + + // Listing 4 code/ch06 + ACE_SOCK_Connector logConnector; + ACE_Time_Value timeout (10); + ACE_SOCK_Stream log; + if (logConnector.connect (log, addr, &timeout) == -1) + { + if (ACE_OS::last_error() == ETIME) + { + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT ("(%P|%t) Timeout while ") + ACE_TEXT ("connecting to log server\n"))); + } + else + { + ACE_ERROR ((LM_ERROR, + ACE_TEXT ("%p\n"), + ACE_TEXT ("log"))); + } + return (101); + } + // Listing 4 + + /* + * We generally let the OS pick our local port number but + * if you want, you can choose that also: + // Listing 5 code/ch06 + ACE_SOCK_Connector logConnector; + ACE_INET_Addr local (4200, ACE_LOCALHOST); + if (logConnector.connect (log, addr, 0, local) == -1) + { + ... + // Listing 5 + } + */ + + char buf[64]; + + // Listing 6 code/ch06 + ACE_Time_Value sendTimeout (0, 5); + if (status.send_n ("uptime\n", 7, &sendTimeout) == -1) + { + if (ACE_OS::last_error() == ETIME) + { + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT ("(%P|%t) Timeout while sending ") + ACE_TEXT ("query to status server\n"))); + } + // Listing 6 + else + { + ACE_ERROR ((LM_ERROR, + ACE_TEXT ("%p\n"), + ACE_TEXT ("send_n"))); + } + return (102); + } + + // Listing 7 code/ch06 + ssize_t bc ; + ACE_Time_Value recvTimeout (0, 1); + if ((bc = status.recv (buf, sizeof(buf), &recvTimeout)) == -1) + { + ACE_ERROR ((LM_ERROR, + ACE_TEXT ("%p\n"), + ACE_TEXT ("recv"))); + return (103); + } + + log.send_n (buf, bc); + // Listing 7 + + status.close (); + log.close (); + + return (0); +} |