Home | History | Annotate | Download | only in base
      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_|.
     62   bool IsOutBufferEmpty() const { return outpos_ == 0; }
     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);
     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