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 WEBRTC_BASE_ASYNCTCPSOCKET_H_ 12 #define WEBRTC_BASE_ASYNCTCPSOCKET_H_ 13 14 #include "webrtc/base/asyncpacketsocket.h" 15 #include "webrtc/base/scoped_ptr.h" 16 #include "webrtc/base/socketfactory.h" 17 18 namespace rtc { 19 20 // Simulates UDP semantics over TCP. Send and Recv packet sizes 21 // are preserved, and drops packets silently on Send, rather than 22 // buffer them in user space. 23 class AsyncTCPSocketBase : public AsyncPacketSocket { 24 public: 25 AsyncTCPSocketBase(AsyncSocket* socket, bool listen, size_t max_packet_size); 26 ~AsyncTCPSocketBase() override; 27 28 // Pure virtual methods to send and recv data. 29 int Send(const void *pv, size_t cb, 30 const rtc::PacketOptions& options) override = 0; 31 virtual void ProcessInput(char* data, size_t* len) = 0; 32 // Signals incoming connection. 33 virtual void HandleIncomingConnection(AsyncSocket* socket) = 0; 34 35 SocketAddress GetLocalAddress() const override; 36 SocketAddress GetRemoteAddress() const override; 37 int SendTo(const void* pv, 38 size_t cb, 39 const SocketAddress& addr, 40 const rtc::PacketOptions& options) override; 41 int Close() override; 42 43 State GetState() const override; 44 int GetOption(Socket::Option opt, int* value) override; 45 int SetOption(Socket::Option opt, int value) override; 46 int GetError() const override; 47 void SetError(int error) override; 48 49 protected: 50 // Binds and connects |socket| and creates AsyncTCPSocket for 51 // it. Takes ownership of |socket|. Returns NULL if bind() or 52 // connect() fail (|socket| is destroyed in that case). 53 static AsyncSocket* ConnectSocket(AsyncSocket* socket, 54 const SocketAddress& bind_address, 55 const SocketAddress& remote_address); 56 virtual int SendRaw(const void* pv, size_t cb); 57 int FlushOutBuffer(); 58 // Add data to |outbuf_|. 59 void AppendToOutBuffer(const void* pv, size_t cb); 60 61 // Helper methods for |outpos_|. IsOutBufferEmpty()62 bool IsOutBufferEmpty() const { return outpos_ == 0; } ClearOutBuffer()63 void ClearOutBuffer() { outpos_ = 0; } 64 65 private: 66 // Called by the underlying socket 67 void OnConnectEvent(AsyncSocket* socket); 68 void OnReadEvent(AsyncSocket* socket); 69 void OnWriteEvent(AsyncSocket* socket); 70 void OnCloseEvent(AsyncSocket* socket, int error); 71 72 scoped_ptr<AsyncSocket> socket_; 73 bool listen_; 74 char* inbuf_, * outbuf_; 75 size_t insize_, inpos_, outsize_, outpos_; 76 77 RTC_DISALLOW_COPY_AND_ASSIGN(AsyncTCPSocketBase); 78 }; 79 80 class AsyncTCPSocket : public AsyncTCPSocketBase { 81 public: 82 // Binds and connects |socket| and creates AsyncTCPSocket for 83 // it. Takes ownership of |socket|. Returns NULL if bind() or 84 // connect() fail (|socket| is destroyed in that case). 85 static AsyncTCPSocket* Create(AsyncSocket* socket, 86 const SocketAddress& bind_address, 87 const SocketAddress& remote_address); 88 AsyncTCPSocket(AsyncSocket* socket, bool listen); ~AsyncTCPSocket()89 ~AsyncTCPSocket() override {} 90 91 int Send(const void* pv, 92 size_t cb, 93 const rtc::PacketOptions& options) override; 94 void ProcessInput(char* data, size_t* len) override; 95 void HandleIncomingConnection(AsyncSocket* socket) override; 96 97 private: 98 RTC_DISALLOW_COPY_AND_ASSIGN(AsyncTCPSocket); 99 }; 100 101 } // namespace rtc 102 103 #endif // WEBRTC_BASE_ASYNCTCPSOCKET_H_ 104