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_SOCKET_H__
     12 #define WEBRTC_BASE_SOCKET_H__
     13 
     14 #include <errno.h>
     15 
     16 #if defined(WEBRTC_POSIX)
     17 #include <sys/types.h>
     18 #include <sys/socket.h>
     19 #include <arpa/inet.h>
     20 #include <netinet/in.h>
     21 #define SOCKET_EACCES EACCES
     22 #endif
     23 
     24 #if defined(WEBRTC_WIN)
     25 #include "webrtc/base/win32.h"
     26 #endif
     27 
     28 #include "webrtc/base/basictypes.h"
     29 #include "webrtc/base/constructormagic.h"
     30 #include "webrtc/base/socketaddress.h"
     31 
     32 // Rather than converting errors into a private namespace,
     33 // Reuse the POSIX socket api errors. Note this depends on
     34 // Win32 compatibility.
     35 
     36 #if defined(WEBRTC_WIN)
     37 #undef EWOULDBLOCK  // Remove errno.h's definition for each macro below.
     38 #define EWOULDBLOCK WSAEWOULDBLOCK
     39 #undef EINPROGRESS
     40 #define EINPROGRESS WSAEINPROGRESS
     41 #undef EALREADY
     42 #define EALREADY WSAEALREADY
     43 #undef ENOTSOCK
     44 #define ENOTSOCK WSAENOTSOCK
     45 #undef EDESTADDRREQ
     46 #define EDESTADDRREQ WSAEDESTADDRREQ
     47 #undef EMSGSIZE
     48 #define EMSGSIZE WSAEMSGSIZE
     49 #undef EPROTOTYPE
     50 #define EPROTOTYPE WSAEPROTOTYPE
     51 #undef ENOPROTOOPT
     52 #define ENOPROTOOPT WSAENOPROTOOPT
     53 #undef EPROTONOSUPPORT
     54 #define EPROTONOSUPPORT WSAEPROTONOSUPPORT
     55 #undef ESOCKTNOSUPPORT
     56 #define ESOCKTNOSUPPORT WSAESOCKTNOSUPPORT
     57 #undef EOPNOTSUPP
     58 #define EOPNOTSUPP WSAEOPNOTSUPP
     59 #undef EPFNOSUPPORT
     60 #define EPFNOSUPPORT WSAEPFNOSUPPORT
     61 #undef EAFNOSUPPORT
     62 #define EAFNOSUPPORT WSAEAFNOSUPPORT
     63 #undef EADDRINUSE
     64 #define EADDRINUSE WSAEADDRINUSE
     65 #undef EADDRNOTAVAIL
     66 #define EADDRNOTAVAIL WSAEADDRNOTAVAIL
     67 #undef ENETDOWN
     68 #define ENETDOWN WSAENETDOWN
     69 #undef ENETUNREACH
     70 #define ENETUNREACH WSAENETUNREACH
     71 #undef ENETRESET
     72 #define ENETRESET WSAENETRESET
     73 #undef ECONNABORTED
     74 #define ECONNABORTED WSAECONNABORTED
     75 #undef ECONNRESET
     76 #define ECONNRESET WSAECONNRESET
     77 #undef ENOBUFS
     78 #define ENOBUFS WSAENOBUFS
     79 #undef EISCONN
     80 #define EISCONN WSAEISCONN
     81 #undef ENOTCONN
     82 #define ENOTCONN WSAENOTCONN
     83 #undef ESHUTDOWN
     84 #define ESHUTDOWN WSAESHUTDOWN
     85 #undef ETOOMANYREFS
     86 #define ETOOMANYREFS WSAETOOMANYREFS
     87 #undef ETIMEDOUT
     88 #define ETIMEDOUT WSAETIMEDOUT
     89 #undef ECONNREFUSED
     90 #define ECONNREFUSED WSAECONNREFUSED
     91 #undef ELOOP
     92 #define ELOOP WSAELOOP
     93 #undef ENAMETOOLONG
     94 #define ENAMETOOLONG WSAENAMETOOLONG
     95 #undef EHOSTDOWN
     96 #define EHOSTDOWN WSAEHOSTDOWN
     97 #undef EHOSTUNREACH
     98 #define EHOSTUNREACH WSAEHOSTUNREACH
     99 #undef ENOTEMPTY
    100 #define ENOTEMPTY WSAENOTEMPTY
    101 #undef EPROCLIM
    102 #define EPROCLIM WSAEPROCLIM
    103 #undef EUSERS
    104 #define EUSERS WSAEUSERS
    105 #undef EDQUOT
    106 #define EDQUOT WSAEDQUOT
    107 #undef ESTALE
    108 #define ESTALE WSAESTALE
    109 #undef EREMOTE
    110 #define EREMOTE WSAEREMOTE
    111 #undef EACCES
    112 #define SOCKET_EACCES WSAEACCES
    113 #endif  // WEBRTC_WIN
    114 
    115 #if defined(WEBRTC_POSIX)
    116 #define INVALID_SOCKET (-1)
    117 #define SOCKET_ERROR (-1)
    118 #define closesocket(s) close(s)
    119 #endif  // WEBRTC_POSIX
    120 
    121 namespace rtc {
    122 
    123 inline bool IsBlockingError(int e) {
    124   return (e == EWOULDBLOCK) || (e == EAGAIN) || (e == EINPROGRESS);
    125 }
    126 
    127 struct SentPacket {
    128   SentPacket() : packet_id(-1), send_time_ms(-1) {}
    129   SentPacket(int packet_id, int64_t send_time_ms)
    130       : packet_id(packet_id), send_time_ms(send_time_ms) {}
    131 
    132   int packet_id;
    133   int64_t send_time_ms;
    134 };
    135 
    136 // General interface for the socket implementations of various networks.  The
    137 // methods match those of normal UNIX sockets very closely.
    138 class Socket {
    139  public:
    140   virtual ~Socket() {}
    141 
    142   // Returns the address to which the socket is bound.  If the socket is not
    143   // bound, then the any-address is returned.
    144   virtual SocketAddress GetLocalAddress() const = 0;
    145 
    146   // Returns the address to which the socket is connected.  If the socket is
    147   // not connected, then the any-address is returned.
    148   virtual SocketAddress GetRemoteAddress() const = 0;
    149 
    150   virtual int Bind(const SocketAddress& addr) = 0;
    151   virtual int Connect(const SocketAddress& addr) = 0;
    152   virtual int Send(const void *pv, size_t cb) = 0;
    153   virtual int SendTo(const void *pv, size_t cb, const SocketAddress& addr) = 0;
    154   virtual int Recv(void *pv, size_t cb) = 0;
    155   virtual int RecvFrom(void *pv, size_t cb, SocketAddress *paddr) = 0;
    156   virtual int Listen(int backlog) = 0;
    157   virtual Socket *Accept(SocketAddress *paddr) = 0;
    158   virtual int Close() = 0;
    159   virtual int GetError() const = 0;
    160   virtual void SetError(int error) = 0;
    161   inline bool IsBlocking() const { return IsBlockingError(GetError()); }
    162 
    163   enum ConnState {
    164     CS_CLOSED,
    165     CS_CONNECTING,
    166     CS_CONNECTED
    167   };
    168   virtual ConnState GetState() const = 0;
    169 
    170   // Fills in the given uint16_t with the current estimate of the MTU along the
    171   // path to the address to which this socket is connected. NOTE: This method
    172   // can block for up to 10 seconds on Windows.
    173   virtual int EstimateMTU(uint16_t* mtu) = 0;
    174 
    175   enum Option {
    176     OPT_DONTFRAGMENT,
    177     OPT_RCVBUF,      // receive buffer size
    178     OPT_SNDBUF,      // send buffer size
    179     OPT_NODELAY,     // whether Nagle algorithm is enabled
    180     OPT_IPV6_V6ONLY, // Whether the socket is IPv6 only.
    181     OPT_DSCP,        // DSCP code
    182     OPT_RTP_SENDTIME_EXTN_ID,  // This is a non-traditional socket option param.
    183                                // This is specific to libjingle and will be used
    184                                // if SendTime option is needed at socket level.
    185   };
    186   virtual int GetOption(Option opt, int* value) = 0;
    187   virtual int SetOption(Option opt, int value) = 0;
    188 
    189  protected:
    190   Socket() {}
    191 
    192  private:
    193   RTC_DISALLOW_COPY_AND_ASSIGN(Socket);
    194 };
    195 
    196 }  // namespace rtc
    197 
    198 #endif  // WEBRTC_BASE_SOCKET_H__
    199