147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/*
247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  Copyright 2004 The WebRTC Project Authors. All rights reserved.
347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *
447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  Use of this source code is governed by a BSD-style license
547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  that can be found in the LICENSE file in the root of the source
647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  tree. An additional intellectual property rights grant can be found
747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  in the file PATENTS.  All contributing project authors may
847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org */
1047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
1147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#ifndef WEBRTC_BASE_SOCKET_H__
1247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define WEBRTC_BASE_SOCKET_H__
1347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
1447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include <errno.h>
1547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
1647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(WEBRTC_POSIX)
1747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include <sys/types.h>
1847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include <sys/socket.h>
1947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include <arpa/inet.h>
2047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include <netinet/in.h>
2147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define SOCKET_EACCES EACCES
2247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif
2347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
2447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(WEBRTC_WIN)
2547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/win32.h"
2647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif
2747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
2847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/basictypes.h"
2947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/socketaddress.h"
3047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
3147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Rather than converting errors into a private namespace,
3247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Reuse the POSIX socket api errors. Note this depends on
3347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Win32 compatibility.
3447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
3547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(WEBRTC_WIN)
3647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#undef EWOULDBLOCK  // Remove errno.h's definition for each macro below.
3747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define EWOULDBLOCK WSAEWOULDBLOCK
3847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#undef EINPROGRESS
3947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define EINPROGRESS WSAEINPROGRESS
4047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#undef EALREADY
4147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define EALREADY WSAEALREADY
4247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#undef ENOTSOCK
4347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define ENOTSOCK WSAENOTSOCK
4447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#undef EDESTADDRREQ
4547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define EDESTADDRREQ WSAEDESTADDRREQ
4647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#undef EMSGSIZE
4747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define EMSGSIZE WSAEMSGSIZE
4847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#undef EPROTOTYPE
4947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define EPROTOTYPE WSAEPROTOTYPE
5047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#undef ENOPROTOOPT
5147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define ENOPROTOOPT WSAENOPROTOOPT
5247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#undef EPROTONOSUPPORT
5347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define EPROTONOSUPPORT WSAEPROTONOSUPPORT
5447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#undef ESOCKTNOSUPPORT
5547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define ESOCKTNOSUPPORT WSAESOCKTNOSUPPORT
5647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#undef EOPNOTSUPP
5747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define EOPNOTSUPP WSAEOPNOTSUPP
5847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#undef EPFNOSUPPORT
5947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define EPFNOSUPPORT WSAEPFNOSUPPORT
6047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#undef EAFNOSUPPORT
6147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define EAFNOSUPPORT WSAEAFNOSUPPORT
6247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#undef EADDRINUSE
6347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define EADDRINUSE WSAEADDRINUSE
6447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#undef EADDRNOTAVAIL
6547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define EADDRNOTAVAIL WSAEADDRNOTAVAIL
6647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#undef ENETDOWN
6747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define ENETDOWN WSAENETDOWN
6847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#undef ENETUNREACH
6947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define ENETUNREACH WSAENETUNREACH
7047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#undef ENETRESET
7147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define ENETRESET WSAENETRESET
7247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#undef ECONNABORTED
7347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define ECONNABORTED WSAECONNABORTED
7447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#undef ECONNRESET
7547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define ECONNRESET WSAECONNRESET
7647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#undef ENOBUFS
7747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define ENOBUFS WSAENOBUFS
7847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#undef EISCONN
7947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define EISCONN WSAEISCONN
8047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#undef ENOTCONN
8147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define ENOTCONN WSAENOTCONN
8247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#undef ESHUTDOWN
8347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define ESHUTDOWN WSAESHUTDOWN
8447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#undef ETOOMANYREFS
8547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define ETOOMANYREFS WSAETOOMANYREFS
8647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#undef ETIMEDOUT
8747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define ETIMEDOUT WSAETIMEDOUT
8847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#undef ECONNREFUSED
8947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define ECONNREFUSED WSAECONNREFUSED
9047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#undef ELOOP
9147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define ELOOP WSAELOOP
9247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#undef ENAMETOOLONG
9347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define ENAMETOOLONG WSAENAMETOOLONG
9447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#undef EHOSTDOWN
9547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define EHOSTDOWN WSAEHOSTDOWN
9647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#undef EHOSTUNREACH
9747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define EHOSTUNREACH WSAEHOSTUNREACH
9847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#undef ENOTEMPTY
9947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define ENOTEMPTY WSAENOTEMPTY
10047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#undef EPROCLIM
10147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define EPROCLIM WSAEPROCLIM
10247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#undef EUSERS
10347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define EUSERS WSAEUSERS
10447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#undef EDQUOT
10547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define EDQUOT WSAEDQUOT
10647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#undef ESTALE
10747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define ESTALE WSAESTALE
10847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#undef EREMOTE
10947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define EREMOTE WSAEREMOTE
11047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#undef EACCES
11147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define SOCKET_EACCES WSAEACCES
11247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif  // WEBRTC_WIN
11347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
11447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(WEBRTC_POSIX)
11547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define INVALID_SOCKET (-1)
11647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define SOCKET_ERROR (-1)
11747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define closesocket(s) close(s)
11847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif  // WEBRTC_POSIX
11947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
12047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgnamespace rtc {
12147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
12247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orginline bool IsBlockingError(int e) {
12347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  return (e == EWOULDBLOCK) || (e == EAGAIN) || (e == EINPROGRESS);
12447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
12547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
12647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// General interface for the socket implementations of various networks.  The
12747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// methods match those of normal UNIX sockets very closely.
12847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass Socket {
12947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org public:
13047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  virtual ~Socket() {}
13147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
13247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // Returns the address to which the socket is bound.  If the socket is not
13347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // bound, then the any-address is returned.
13447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  virtual SocketAddress GetLocalAddress() const = 0;
13547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
13647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // Returns the address to which the socket is connected.  If the socket is
13747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // not connected, then the any-address is returned.
13847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  virtual SocketAddress GetRemoteAddress() const = 0;
13947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
14047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  virtual int Bind(const SocketAddress& addr) = 0;
14147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  virtual int Connect(const SocketAddress& addr) = 0;
14247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  virtual int Send(const void *pv, size_t cb) = 0;
14347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  virtual int SendTo(const void *pv, size_t cb, const SocketAddress& addr) = 0;
14447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  virtual int Recv(void *pv, size_t cb) = 0;
14547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  virtual int RecvFrom(void *pv, size_t cb, SocketAddress *paddr) = 0;
14647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  virtual int Listen(int backlog) = 0;
14747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  virtual Socket *Accept(SocketAddress *paddr) = 0;
14847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  virtual int Close() = 0;
14947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  virtual int GetError() const = 0;
15047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  virtual void SetError(int error) = 0;
15147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  inline bool IsBlocking() const { return IsBlockingError(GetError()); }
15247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
15347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  enum ConnState {
15447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    CS_CLOSED,
15547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    CS_CONNECTING,
15647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    CS_CONNECTED
15747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  };
15847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  virtual ConnState GetState() const = 0;
15947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
16047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // Fills in the given uint16 with the current estimate of the MTU along the
16147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // path to the address to which this socket is connected. NOTE: This method
16247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // can block for up to 10 seconds on Windows.
16347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  virtual int EstimateMTU(uint16* mtu) = 0;
16447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
16547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  enum Option {
16647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    OPT_DONTFRAGMENT,
16747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    OPT_RCVBUF,      // receive buffer size
16847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    OPT_SNDBUF,      // send buffer size
16947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    OPT_NODELAY,     // whether Nagle algorithm is enabled
17047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    OPT_IPV6_V6ONLY, // Whether the socket is IPv6 only.
17147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    OPT_DSCP,        // DSCP code
17247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    OPT_RTP_SENDTIME_EXTN_ID,  // This is a non-traditional socket option param.
17347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                               // This is specific to libjingle and will be used
17447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                               // if SendTime option is needed at socket level.
17547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  };
17647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  virtual int GetOption(Option opt, int* value) = 0;
17747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  virtual int SetOption(Option opt, int value) = 0;
17847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
17947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org protected:
18047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Socket() {}
18147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
18247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org private:
18347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  DISALLOW_EVIL_CONSTRUCTORS(Socket);
18447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org};
18547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
18647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}  // namespace rtc
18747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
18847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif  // WEBRTC_BASE_SOCKET_H__
189