1 /* 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 11 #ifndef RTC_BASE_ASYNC_TCP_SOCKET_H_ 12 #define RTC_BASE_ASYNC_TCP_SOCKET_H_ 13 14 #include <stddef.h> 15 16 #include <memory> 17 18 #include "rtc_base/async_packet_socket.h" 19 #include "rtc_base/async_socket.h" 20 #include "rtc_base/buffer.h" 21 #include "rtc_base/constructor_magic.h" 22 #include "rtc_base/socket.h" 23 #include "rtc_base/socket_address.h" 24 25 namespace 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. 30 class AsyncTCPSocketBase : public AsyncPacketSocket { 31 public: 32 AsyncTCPSocketBase(AsyncSocket* socket, bool listen, size_t max_packet_size); 33 ~AsyncTCPSocketBase() override; 34 35 // Pure virtual methods to send and recv data. 36 int Send(const void* pv, 37 size_t cb, 38 const rtc::PacketOptions& options) override = 0; 39 virtual void ProcessInput(char* data, size_t* len) = 0; 40 // Signals incoming connection. 41 virtual void HandleIncomingConnection(AsyncSocket* socket) = 0; 42 43 SocketAddress GetLocalAddress() const override; 44 SocketAddress GetRemoteAddress() const override; 45 int SendTo(const void* pv, 46 size_t cb, 47 const SocketAddress& addr, 48 const rtc::PacketOptions& options) override; 49 int Close() override; 50 51 State GetState() const override; 52 int GetOption(Socket::Option opt, int* value) override; 53 int SetOption(Socket::Option opt, int value) override; 54 int GetError() const override; 55 void SetError(int error) override; 56 57 protected: 58 // Binds and connects |socket| and creates AsyncTCPSocket for 59 // it. Takes ownership of |socket|. Returns null if bind() or 60 // connect() fail (|socket| is destroyed in that case). 61 static AsyncSocket* ConnectSocket(AsyncSocket* socket, 62 const SocketAddress& bind_address, 63 const SocketAddress& remote_address); 64 int FlushOutBuffer(); 65 // Add data to |outbuf_|. 66 void AppendToOutBuffer(const void* pv, size_t cb); 67 68 // Helper methods for |outpos_|. IsOutBufferEmpty()69 bool IsOutBufferEmpty() const { return outbuf_.size() == 0; } ClearOutBuffer()70 void ClearOutBuffer() { outbuf_.Clear(); } 71 72 private: 73 // Called by the underlying socket 74 void OnConnectEvent(AsyncSocket* socket); 75 void OnReadEvent(AsyncSocket* socket); 76 void OnWriteEvent(AsyncSocket* socket); 77 void OnCloseEvent(AsyncSocket* socket, int error); 78 79 std::unique_ptr<AsyncSocket> socket_; 80 bool listen_; 81 Buffer inbuf_; 82 Buffer outbuf_; 83 size_t max_insize_; 84 size_t max_outsize_; 85 86 RTC_DISALLOW_COPY_AND_ASSIGN(AsyncTCPSocketBase); 87 }; 88 89 class AsyncTCPSocket : public AsyncTCPSocketBase { 90 public: 91 // Binds and connects |socket| and creates AsyncTCPSocket for 92 // it. Takes ownership of |socket|. Returns null if bind() or 93 // connect() fail (|socket| is destroyed in that case). 94 static AsyncTCPSocket* Create(AsyncSocket* socket, 95 const SocketAddress& bind_address, 96 const SocketAddress& remote_address); 97 AsyncTCPSocket(AsyncSocket* socket, bool listen); ~AsyncTCPSocket()98 ~AsyncTCPSocket() override {} 99 100 int Send(const void* pv, 101 size_t cb, 102 const rtc::PacketOptions& options) override; 103 void ProcessInput(char* data, size_t* len) override; 104 void HandleIncomingConnection(AsyncSocket* socket) override; 105 106 private: 107 RTC_DISALLOW_COPY_AND_ASSIGN(AsyncTCPSocket); 108 }; 109 110 } // namespace rtc 111 112 #endif // RTC_BASE_ASYNC_TCP_SOCKET_H_ 113