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