summaryrefslogtreecommitdiff
path: root/ACE/ace/SOCK_CODgram.h
blob: bbe37f296238c7c880bc199877c23328c8f81832 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
// -*- C++ -*-

//=============================================================================
/**
 *  @file    SOCK_CODgram.h
 *
 *  @author Doug Schmidt
 */
//=============================================================================


#ifndef ACE_SOCK_CODGRAM_H
#define ACE_SOCK_CODGRAM_H
#include /**/ "ace/pre.h"

#include /**/ "ace/ACE_export.h"

#if !defined (ACE_LACKS_PRAGMA_ONCE)
# pragma once
#endif /* ACE_LACKS_PRAGMA_ONCE */

#include "ace/SOCK_IO.h"
#include "ace/Addr.h"
#include "ace/INET_Addr.h"

ACE_BEGIN_VERSIONED_NAMESPACE_DECL

/**
 * @class ACE_SOCK_CODgram
 *
 * @brief Defines the member functions for the ACE_SOCK connected
 * datagram abstraction.
 */
class ACE_Export ACE_SOCK_CODgram : public ACE_SOCK_IO
{
public:
  /// Default constructor.
  ACE_SOCK_CODgram (void);

  /**
   * Constructor with addresses specified. Calls open().
   * This constructor binds and/or connects to a specified address,
   * optionally binding an unused port number.
   *
   * @param remote_sap      The remote address.
   * @param local_sap       The local address.
   * @param protocol_family The protocol family for the new socket. If
   *                        either @p remote_sap or @p local_sap is
   *                        specified (i.e., not ACE_Addr::sap_any) its
   *                        address type is used instead of this value.
   *                        If both addresses are specified, their address
   *                        types must match. If neither address is specified,
   *                        the platform's default IP address type is used.
   * @param protocol        Protocol value for the new socket.
   * @param reuse_addr      Reuse the local address or not.
   *
   * There are four possible combinations of remote_sap and local_sap. The
   * behavior in these combinations is:
   *
   * @li <b>remote_addr == ACE_Addr::sap_any && local_addr == ACE_Addr::sap_any:</b>
   *     If @p protocol_family specifies PF_INET or PF_INET6,
   *     bind the local address to a randomly generated port number.
   *
   * @li <b>remote_addr == ACE_Addr::sap_any && local_addr != ACE_Addr::sap_any:</b>
   *     Bind the local address (used primarily by servers).
   *
   * @li <b>remote_addr != ACE_Addr::sap_any && local_addr == ACE_Addr::sap_any:</b>
   *     Connect to the remote address without binding a local address
   *     (used primarily by clients).
   *
   * @li <b>remote_addr != ACE_Addr::sap_any && local_addr != ACE_Addr::sap_any:</b>
   *     Bind to the local address and connect to the remote address.
   */
  ACE_SOCK_CODgram (const ACE_Addr &remote_sap,
                    const ACE_Addr &local_sap = ACE_Addr::sap_any,
                    int protocol_family = ACE_PROTOCOL_FAMILY_INET,
                    int protocol = 0,
                    int reuse_addr = 0);

  /// Default dtor.
  ~ACE_SOCK_CODgram (void);

  // Initiate a connected dgram.

  /**
   * Initiate a connected datagram socket, optionally binding an
   * unused port number.
   *
   * @param remote_sap      The remote address.
   * @param local_sap       The local address.
   * @param protocol_family The protocol family for the new socket. If
   *                        either @p remote_sap or @p local_sap is
   *                        specified (i.e., not ACE_Addr::sap_any) its
   *                        address type is used instead of this value.
   *                        If both addresses are specified, their address
   *                        types must match. If neither address is specified,
   *                        the platform's default IP address type is used.
   * @param protocol        Protocol value for the new socket.
   * @param reuse_addr      Reuse the local address or not.
   *
   * There are four possible combinations of remote_sap and local_sap. The
   * behavior in these combinations is:
   *
   * @li <b>remote_addr == ACE_Addr::sap_any && local_addr == ACE_Addr::sap_any:</b>
   *     If @p protocol_family specifies PF_INET or PF_INET6,
   *     bind the local address to a randomly generated port number.
   *
   * @li <b>remote_addr == ACE_Addr::sap_any && local_addr != ACE_Addr::sap_any:</b>
   *     Bind the local address (used primarily by servers).
   *
   * @li <b>remote_addr != ACE_Addr::sap_any && local_addr == ACE_Addr::sap_any:</b>
   *     Connect to the remote address without binding a local address
   *     (used primarily by clients).
   *
   * @li <b>remote_addr != ACE_Addr::sap_any && local_addr != ACE_Addr::sap_any:</b>
   *     Bind to the local address and connect to the remote address.
   */
  int open (const ACE_Addr &remote_sap,
            const ACE_Addr &local_sap = ACE_Addr::sap_any,
            int protocol_family = ACE_PROTOCOL_FAMILY_INET,
            int protocol = 0,
            int reuse_addr = 0);

  // = Meta-type info.
  typedef ACE_INET_Addr PEER_ADDR;

  /// Dump the state of an object.
  void dump () const;

  /// Declare the dynamic allocation hooks.
  ACE_ALLOC_HOOK_DECLARE;
};

ACE_END_VERSIONED_NAMESPACE_DECL

#if defined (__ACE_INLINE__)
#include "ace/SOCK_CODgram.inl"
#endif /* __ACE_INLINE__ */

#include /**/ "ace/post.h"
#endif /* ACE_SOCK_CODGRAM_H */