1*d9f75844SAndroid Build Coastguard Worker /* 2*d9f75844SAndroid Build Coastguard Worker * Copyright 2004 The WebRTC Project Authors. All rights reserved. 3*d9f75844SAndroid Build Coastguard Worker * 4*d9f75844SAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license 5*d9f75844SAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source 6*d9f75844SAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found 7*d9f75844SAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may 8*d9f75844SAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree. 9*d9f75844SAndroid Build Coastguard Worker */ 10*d9f75844SAndroid Build Coastguard Worker 11*d9f75844SAndroid Build Coastguard Worker #ifndef RTC_BASE_ASYNC_TCP_SOCKET_H_ 12*d9f75844SAndroid Build Coastguard Worker #define RTC_BASE_ASYNC_TCP_SOCKET_H_ 13*d9f75844SAndroid Build Coastguard Worker 14*d9f75844SAndroid Build Coastguard Worker #include <stddef.h> 15*d9f75844SAndroid Build Coastguard Worker 16*d9f75844SAndroid Build Coastguard Worker #include <memory> 17*d9f75844SAndroid Build Coastguard Worker 18*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/async_packet_socket.h" 19*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/buffer.h" 20*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/socket.h" 21*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/socket_address.h" 22*d9f75844SAndroid Build Coastguard Worker 23*d9f75844SAndroid Build Coastguard Worker namespace rtc { 24*d9f75844SAndroid Build Coastguard Worker 25*d9f75844SAndroid Build Coastguard Worker // Simulates UDP semantics over TCP. Send and Recv packet sizes 26*d9f75844SAndroid Build Coastguard Worker // are preserved, and drops packets silently on Send, rather than 27*d9f75844SAndroid Build Coastguard Worker // buffer them in user space. 28*d9f75844SAndroid Build Coastguard Worker class AsyncTCPSocketBase : public AsyncPacketSocket { 29*d9f75844SAndroid Build Coastguard Worker public: 30*d9f75844SAndroid Build Coastguard Worker AsyncTCPSocketBase(Socket* socket, size_t max_packet_size); 31*d9f75844SAndroid Build Coastguard Worker ~AsyncTCPSocketBase() override; 32*d9f75844SAndroid Build Coastguard Worker 33*d9f75844SAndroid Build Coastguard Worker AsyncTCPSocketBase(const AsyncTCPSocketBase&) = delete; 34*d9f75844SAndroid Build Coastguard Worker AsyncTCPSocketBase& operator=(const AsyncTCPSocketBase&) = delete; 35*d9f75844SAndroid Build Coastguard Worker 36*d9f75844SAndroid Build Coastguard Worker // Pure virtual methods to send and recv data. 37*d9f75844SAndroid Build Coastguard Worker int Send(const void* pv, 38*d9f75844SAndroid Build Coastguard Worker size_t cb, 39*d9f75844SAndroid Build Coastguard Worker const rtc::PacketOptions& options) override = 0; 40*d9f75844SAndroid Build Coastguard Worker virtual void ProcessInput(char* data, size_t* len) = 0; 41*d9f75844SAndroid Build Coastguard Worker 42*d9f75844SAndroid Build Coastguard Worker SocketAddress GetLocalAddress() const override; 43*d9f75844SAndroid Build Coastguard Worker SocketAddress GetRemoteAddress() const override; 44*d9f75844SAndroid Build Coastguard Worker int SendTo(const void* pv, 45*d9f75844SAndroid Build Coastguard Worker size_t cb, 46*d9f75844SAndroid Build Coastguard Worker const SocketAddress& addr, 47*d9f75844SAndroid Build Coastguard Worker const rtc::PacketOptions& options) override; 48*d9f75844SAndroid Build Coastguard Worker int Close() override; 49*d9f75844SAndroid Build Coastguard Worker 50*d9f75844SAndroid Build Coastguard Worker State GetState() const override; 51*d9f75844SAndroid Build Coastguard Worker int GetOption(Socket::Option opt, int* value) override; 52*d9f75844SAndroid Build Coastguard Worker int SetOption(Socket::Option opt, int value) override; 53*d9f75844SAndroid Build Coastguard Worker int GetError() const override; 54*d9f75844SAndroid Build Coastguard Worker void SetError(int error) override; 55*d9f75844SAndroid Build Coastguard Worker 56*d9f75844SAndroid Build Coastguard Worker protected: 57*d9f75844SAndroid Build Coastguard Worker // Binds and connects `socket` and creates AsyncTCPSocket for 58*d9f75844SAndroid Build Coastguard Worker // it. Takes ownership of `socket`. Returns null if bind() or 59*d9f75844SAndroid Build Coastguard Worker // connect() fail (`socket` is destroyed in that case). 60*d9f75844SAndroid Build Coastguard Worker static Socket* ConnectSocket(Socket* socket, 61*d9f75844SAndroid Build Coastguard Worker const SocketAddress& bind_address, 62*d9f75844SAndroid Build Coastguard Worker const SocketAddress& remote_address); 63*d9f75844SAndroid Build Coastguard Worker int FlushOutBuffer(); 64*d9f75844SAndroid Build Coastguard Worker // Add data to `outbuf_`. 65*d9f75844SAndroid Build Coastguard Worker void AppendToOutBuffer(const void* pv, size_t cb); 66*d9f75844SAndroid Build Coastguard Worker 67*d9f75844SAndroid Build Coastguard Worker // Helper methods for `outpos_`. IsOutBufferEmpty()68*d9f75844SAndroid Build Coastguard Worker bool IsOutBufferEmpty() const { return outbuf_.size() == 0; } ClearOutBuffer()69*d9f75844SAndroid Build Coastguard Worker void ClearOutBuffer() { outbuf_.Clear(); } 70*d9f75844SAndroid Build Coastguard Worker 71*d9f75844SAndroid Build Coastguard Worker private: 72*d9f75844SAndroid Build Coastguard Worker // Called by the underlying socket 73*d9f75844SAndroid Build Coastguard Worker void OnConnectEvent(Socket* socket); 74*d9f75844SAndroid Build Coastguard Worker void OnReadEvent(Socket* socket); 75*d9f75844SAndroid Build Coastguard Worker void OnWriteEvent(Socket* socket); 76*d9f75844SAndroid Build Coastguard Worker void OnCloseEvent(Socket* socket, int error); 77*d9f75844SAndroid Build Coastguard Worker 78*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<Socket> socket_; 79*d9f75844SAndroid Build Coastguard Worker Buffer inbuf_; 80*d9f75844SAndroid Build Coastguard Worker Buffer outbuf_; 81*d9f75844SAndroid Build Coastguard Worker size_t max_insize_; 82*d9f75844SAndroid Build Coastguard Worker size_t max_outsize_; 83*d9f75844SAndroid Build Coastguard Worker }; 84*d9f75844SAndroid Build Coastguard Worker 85*d9f75844SAndroid Build Coastguard Worker class AsyncTCPSocket : public AsyncTCPSocketBase { 86*d9f75844SAndroid Build Coastguard Worker public: 87*d9f75844SAndroid Build Coastguard Worker // Binds and connects `socket` and creates AsyncTCPSocket for 88*d9f75844SAndroid Build Coastguard Worker // it. Takes ownership of `socket`. Returns null if bind() or 89*d9f75844SAndroid Build Coastguard Worker // connect() fail (`socket` is destroyed in that case). 90*d9f75844SAndroid Build Coastguard Worker static AsyncTCPSocket* Create(Socket* socket, 91*d9f75844SAndroid Build Coastguard Worker const SocketAddress& bind_address, 92*d9f75844SAndroid Build Coastguard Worker const SocketAddress& remote_address); 93*d9f75844SAndroid Build Coastguard Worker explicit AsyncTCPSocket(Socket* socket); ~AsyncTCPSocket()94*d9f75844SAndroid Build Coastguard Worker ~AsyncTCPSocket() override {} 95*d9f75844SAndroid Build Coastguard Worker 96*d9f75844SAndroid Build Coastguard Worker AsyncTCPSocket(const AsyncTCPSocket&) = delete; 97*d9f75844SAndroid Build Coastguard Worker AsyncTCPSocket& operator=(const AsyncTCPSocket&) = delete; 98*d9f75844SAndroid Build Coastguard Worker 99*d9f75844SAndroid Build Coastguard Worker int Send(const void* pv, 100*d9f75844SAndroid Build Coastguard Worker size_t cb, 101*d9f75844SAndroid Build Coastguard Worker const rtc::PacketOptions& options) override; 102*d9f75844SAndroid Build Coastguard Worker void ProcessInput(char* data, size_t* len) override; 103*d9f75844SAndroid Build Coastguard Worker }; 104*d9f75844SAndroid Build Coastguard Worker 105*d9f75844SAndroid Build Coastguard Worker class AsyncTcpListenSocket : public AsyncListenSocket { 106*d9f75844SAndroid Build Coastguard Worker public: 107*d9f75844SAndroid Build Coastguard Worker explicit AsyncTcpListenSocket(std::unique_ptr<Socket> socket); 108*d9f75844SAndroid Build Coastguard Worker 109*d9f75844SAndroid Build Coastguard Worker State GetState() const override; 110*d9f75844SAndroid Build Coastguard Worker SocketAddress GetLocalAddress() const override; 111*d9f75844SAndroid Build Coastguard Worker 112*d9f75844SAndroid Build Coastguard Worker virtual void HandleIncomingConnection(rtc::Socket* socket); 113*d9f75844SAndroid Build Coastguard Worker 114*d9f75844SAndroid Build Coastguard Worker private: 115*d9f75844SAndroid Build Coastguard Worker // Called by the underlying socket 116*d9f75844SAndroid Build Coastguard Worker void OnReadEvent(Socket* socket); 117*d9f75844SAndroid Build Coastguard Worker 118*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<Socket> socket_; 119*d9f75844SAndroid Build Coastguard Worker }; 120*d9f75844SAndroid Build Coastguard Worker 121*d9f75844SAndroid Build Coastguard Worker } // namespace rtc 122*d9f75844SAndroid Build Coastguard Worker 123*d9f75844SAndroid Build Coastguard Worker #endif // RTC_BASE_ASYNC_TCP_SOCKET_H_ 124