blob: d3aff60520596a3660b462e93d9bba56bdb09cd9 [file] [log] [blame]
henrike@webrtc.orgf0488722014-05-13 18:00:261/*
2 * Copyright 2004 The WebRTC Project Authors. All rights reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Steve Anton10542f22019-01-11 17:11:0011#ifndef RTC_BASE_ASYNC_TCP_SOCKET_H_
12#define RTC_BASE_ASYNC_TCP_SOCKET_H_
henrike@webrtc.orgf0488722014-05-13 18:00:2613
Yves Gerey988cc082018-10-23 10:03:0114#include <stddef.h>
Jonas Olssona4d87372019-07-05 17:08:3315
Per Kd07900c2023-11-17 09:18:2516#include <cstdint>
Henrik Kjellanderec78f1c2017-06-29 05:52:5017#include <memory>
jbauch555604a2016-04-26 10:13:2218
Per K357947f2023-11-27 12:03:5219#include "api/array_view.h"
Steve Anton10542f22019-01-11 17:11:0020#include "rtc_base/async_packet_socket.h"
Yves Gerey988cc082018-10-23 10:03:0121#include "rtc_base/buffer.h"
Yves Gerey988cc082018-10-23 10:03:0122#include "rtc_base/socket.h"
Steve Anton10542f22019-01-11 17:11:0023#include "rtc_base/socket_address.h"
Henrik Kjellanderec78f1c2017-06-29 05:52:5024
25namespace rtc {
26
27// Simulates UDP semantics over TCP. Send and Recv packet sizes
28// are preserved, and drops packets silently on Send, rather than
29// buffer them in user space.
30class AsyncTCPSocketBase : public AsyncPacketSocket {
31 public:
Niels Möllerd30ece12021-10-19 08:11:0232 AsyncTCPSocketBase(Socket* socket, size_t max_packet_size);
Henrik Kjellanderec78f1c2017-06-29 05:52:5033 ~AsyncTCPSocketBase() override;
34
Byoungchan Lee14af7622022-01-11 20:24:5835 AsyncTCPSocketBase(const AsyncTCPSocketBase&) = delete;
36 AsyncTCPSocketBase& operator=(const AsyncTCPSocketBase&) = delete;
37
Henrik Kjellanderec78f1c2017-06-29 05:52:5038 // Pure virtual methods to send and recv data.
Yves Gerey665174f2018-06-19 13:03:0539 int Send(const void* pv,
40 size_t cb,
41 const rtc::PacketOptions& options) override = 0;
Per K357947f2023-11-27 12:03:5242 // Must return the number of bytes processed.
43 virtual size_t ProcessInput(rtc::ArrayView<const uint8_t> data) = 0;
Henrik Kjellanderec78f1c2017-06-29 05:52:5044
45 SocketAddress GetLocalAddress() const override;
46 SocketAddress GetRemoteAddress() const override;
47 int SendTo(const void* pv,
48 size_t cb,
49 const SocketAddress& addr,
50 const rtc::PacketOptions& options) override;
51 int Close() override;
52
53 State GetState() const override;
54 int GetOption(Socket::Option opt, int* value) override;
55 int SetOption(Socket::Option opt, int value) override;
56 int GetError() const override;
57 void SetError(int error) override;
58
59 protected:
Artem Titov96e3b992021-07-26 14:03:1460 // Binds and connects `socket` and creates AsyncTCPSocket for
61 // it. Takes ownership of `socket`. Returns null if bind() or
62 // connect() fail (`socket` is destroyed in that case).
Niels Möllerd0b88792021-08-12 08:32:3063 static Socket* ConnectSocket(Socket* socket,
64 const SocketAddress& bind_address,
65 const SocketAddress& remote_address);
Henrik Kjellanderec78f1c2017-06-29 05:52:5066 int FlushOutBuffer();
Artem Titov96e3b992021-07-26 14:03:1467 // Add data to `outbuf_`.
Henrik Kjellanderec78f1c2017-06-29 05:52:5068 void AppendToOutBuffer(const void* pv, size_t cb);
69
Artem Titov96e3b992021-07-26 14:03:1470 // Helper methods for `outpos_`.
Henrik Kjellanderec78f1c2017-06-29 05:52:5071 bool IsOutBufferEmpty() const { return outbuf_.size() == 0; }
72 void ClearOutBuffer() { outbuf_.Clear(); }
73
74 private:
75 // Called by the underlying socket
Niels Möllerd0b88792021-08-12 08:32:3076 void OnConnectEvent(Socket* socket);
77 void OnReadEvent(Socket* socket);
78 void OnWriteEvent(Socket* socket);
79 void OnCloseEvent(Socket* socket, int error);
Henrik Kjellanderec78f1c2017-06-29 05:52:5080
Niels Möllerd0b88792021-08-12 08:32:3081 std::unique_ptr<Socket> socket_;
Henrik Kjellanderec78f1c2017-06-29 05:52:5082 Buffer inbuf_;
83 Buffer outbuf_;
84 size_t max_insize_;
85 size_t max_outsize_;
Henrik Kjellanderec78f1c2017-06-29 05:52:5086};
87
88class AsyncTCPSocket : public AsyncTCPSocketBase {
89 public:
Artem Titov96e3b992021-07-26 14:03:1490 // Binds and connects `socket` and creates AsyncTCPSocket for
91 // it. Takes ownership of `socket`. Returns null if bind() or
92 // connect() fail (`socket` is destroyed in that case).
Niels Möllerd0b88792021-08-12 08:32:3093 static AsyncTCPSocket* Create(Socket* socket,
Henrik Kjellanderec78f1c2017-06-29 05:52:5094 const SocketAddress& bind_address,
95 const SocketAddress& remote_address);
Niels Möllerd30ece12021-10-19 08:11:0296 explicit AsyncTCPSocket(Socket* socket);
Henrik Kjellanderec78f1c2017-06-29 05:52:5097 ~AsyncTCPSocket() override {}
98
Byoungchan Lee14af7622022-01-11 20:24:5899 AsyncTCPSocket(const AsyncTCPSocket&) = delete;
100 AsyncTCPSocket& operator=(const AsyncTCPSocket&) = delete;
101
Henrik Kjellanderec78f1c2017-06-29 05:52:50102 int Send(const void* pv,
103 size_t cb,
104 const rtc::PacketOptions& options) override;
Per K357947f2023-11-27 12:03:52105 size_t ProcessInput(rtc::ArrayView<const uint8_t>) override;
Henrik Kjellanderec78f1c2017-06-29 05:52:50106};
107
Niels Möllerd30ece12021-10-19 08:11:02108class AsyncTcpListenSocket : public AsyncListenSocket {
109 public:
110 explicit AsyncTcpListenSocket(std::unique_ptr<Socket> socket);
111
112 State GetState() const override;
113 SocketAddress GetLocalAddress() const override;
114
Niels Möllerd30ece12021-10-19 08:11:02115 virtual void HandleIncomingConnection(rtc::Socket* socket);
116
117 private:
118 // Called by the underlying socket
119 void OnReadEvent(Socket* socket);
120
121 std::unique_ptr<Socket> socket_;
122};
123
Henrik Kjellanderec78f1c2017-06-29 05:52:50124} // namespace rtc
henrike@webrtc.orgf0488722014-05-13 18:00:26125
Steve Anton10542f22019-01-11 17:11:00126#endif // RTC_BASE_ASYNC_TCP_SOCKET_H_