xref: /aosp_15_r20/external/openscreen/platform/impl/stream_socket.h (revision 3f982cf4871df8771c9d4abe6e9a6f8d829b2736)
1*3f982cf4SFabien Sanglard // Copyright 2019 The Chromium Authors. All rights reserved.
2*3f982cf4SFabien Sanglard // Use of this source code is governed by a BSD-style license that can be
3*3f982cf4SFabien Sanglard // found in the LICENSE file.
4*3f982cf4SFabien Sanglard 
5*3f982cf4SFabien Sanglard #ifndef PLATFORM_IMPL_STREAM_SOCKET_H_
6*3f982cf4SFabien Sanglard #define PLATFORM_IMPL_STREAM_SOCKET_H_
7*3f982cf4SFabien Sanglard 
8*3f982cf4SFabien Sanglard #include <cstdint>
9*3f982cf4SFabien Sanglard #include <memory>
10*3f982cf4SFabien Sanglard #include <string>
11*3f982cf4SFabien Sanglard 
12*3f982cf4SFabien Sanglard #include "platform/api/network_interface.h"
13*3f982cf4SFabien Sanglard #include "platform/base/error.h"
14*3f982cf4SFabien Sanglard #include "platform/base/ip_address.h"
15*3f982cf4SFabien Sanglard #include "platform/base/macros.h"
16*3f982cf4SFabien Sanglard #include "platform/impl/socket_handle.h"
17*3f982cf4SFabien Sanglard #include "platform/impl/socket_state.h"
18*3f982cf4SFabien Sanglard 
19*3f982cf4SFabien Sanglard namespace openscreen {
20*3f982cf4SFabien Sanglard 
21*3f982cf4SFabien Sanglard // StreamSocket is an incomplete abstraction of synchronous platform methods for
22*3f982cf4SFabien Sanglard // creating, initializing, and closing stream sockets. Callers can use this
23*3f982cf4SFabien Sanglard // class to define complete TCP and TLS socket classes, both synchronous and
24*3f982cf4SFabien Sanglard // asynchronous.
25*3f982cf4SFabien Sanglard class StreamSocket {
26*3f982cf4SFabien Sanglard  public:
27*3f982cf4SFabien Sanglard   StreamSocket() = default;
28*3f982cf4SFabien Sanglard   StreamSocket(const StreamSocket& other) = delete;
29*3f982cf4SFabien Sanglard   StreamSocket(StreamSocket&& other) noexcept = default;
30*3f982cf4SFabien Sanglard   virtual ~StreamSocket() = default;
31*3f982cf4SFabien Sanglard 
32*3f982cf4SFabien Sanglard   StreamSocket& operator=(const StreamSocket& other) = delete;
33*3f982cf4SFabien Sanglard   StreamSocket& operator=(StreamSocket&& other) = default;
34*3f982cf4SFabien Sanglard 
35*3f982cf4SFabien Sanglard   // Used by passive/server sockets to accept connection requests
36*3f982cf4SFabien Sanglard   // from a client.
37*3f982cf4SFabien Sanglard   virtual ErrorOr<std::unique_ptr<StreamSocket>> Accept() = 0;
38*3f982cf4SFabien Sanglard 
39*3f982cf4SFabien Sanglard   // Bind to the address provided on socket construction. Socket should be
40*3f982cf4SFabien Sanglard   // unbound and not connected.
41*3f982cf4SFabien Sanglard   virtual Error Bind() = 0;
42*3f982cf4SFabien Sanglard 
43*3f982cf4SFabien Sanglard   // Closes the socket. Socket must be opened before this method is called.
44*3f982cf4SFabien Sanglard   virtual Error Close() = 0;
45*3f982cf4SFabien Sanglard 
46*3f982cf4SFabien Sanglard   // Connects the socket to a specified remote address. Socket should be
47*3f982cf4SFabien Sanglard   // initialized and bound, but not connected.
48*3f982cf4SFabien Sanglard   virtual Error Connect(const IPEndpoint& remote_endpoint) = 0;
49*3f982cf4SFabien Sanglard 
50*3f982cf4SFabien Sanglard   // Marks the socket as passive, to receive incoming connections.
51*3f982cf4SFabien Sanglard   virtual Error Listen() = 0;
52*3f982cf4SFabien Sanglard   virtual Error Listen(int max_backlog_size) = 0;
53*3f982cf4SFabien Sanglard 
54*3f982cf4SFabien Sanglard   // Returns the file descriptor (e.g. fd or HANDLE pointer) for this socket.
55*3f982cf4SFabien Sanglard   virtual const SocketHandle& socket_handle() const = 0;
56*3f982cf4SFabien Sanglard 
57*3f982cf4SFabien Sanglard   // Returns the connected remote address, if socket is connected.
58*3f982cf4SFabien Sanglard   virtual absl::optional<IPEndpoint> remote_address() const = 0;
59*3f982cf4SFabien Sanglard 
60*3f982cf4SFabien Sanglard   // Returns the local address, if one is assigned.
61*3f982cf4SFabien Sanglard   virtual absl::optional<IPEndpoint> local_address() const = 0;
62*3f982cf4SFabien Sanglard 
63*3f982cf4SFabien Sanglard   // Returns the state of the socket.
64*3f982cf4SFabien Sanglard   virtual TcpSocketState state() const = 0;
65*3f982cf4SFabien Sanglard 
66*3f982cf4SFabien Sanglard   // Returns the IP version of the socket.
67*3f982cf4SFabien Sanglard   virtual IPAddress::Version version() const = 0;
68*3f982cf4SFabien Sanglard };
69*3f982cf4SFabien Sanglard 
70*3f982cf4SFabien Sanglard }  // namespace openscreen
71*3f982cf4SFabien Sanglard 
72*3f982cf4SFabien Sanglard #endif  // PLATFORM_IMPL_STREAM_SOCKET_H_
73