1f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch/*
2f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * libjingle
3f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * Copyright 2004--2005, Google Inc.
4f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch *
5f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * Redistribution and use in source and binary forms, with or without
6f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * modification, are permitted provided that the following conditions are met:
7f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch *
8f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch *  1. Redistributions of source code must retain the above copyright notice,
9f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch *     this list of conditions and the following disclaimer.
10f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch *  2. Redistributions in binary form must reproduce the above copyright notice,
11f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch *     this list of conditions and the following disclaimer in the documentation
12f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch *     and/or other materials provided with the distribution.
13f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch *  3. The name of the author may not be used to endorse or promote products
14f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch *     derived from this software without specific prior written permission.
15f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch *
16f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
17f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
19f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
22f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
23f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
24f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
25f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch */
27f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
28f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#ifndef TALK_BASE_SOCKET_H__
29f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#define TALK_BASE_SOCKET_H__
30f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
31f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include <errno.h>
32f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
33f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#ifdef POSIX
34f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include <sys/types.h>
35f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include <sys/socket.h>
36f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include <arpa/inet.h>
37f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include <netinet/in.h>
38f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#define SOCKET_EACCES EACCES
39f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#endif
40f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
41f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#ifdef WIN32
42f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/base/win32.h"
43f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#endif
44f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
45f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/base/basictypes.h"
46f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/base/socketaddress.h"
47f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
48f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// Rather than converting errors into a private namespace,
49f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// Reuse the POSIX socket api errors. Note this depends on
50f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// Win32 compatibility.
51f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
52f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#ifdef WIN32
53dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#undef EWOULDBLOCK  // Remove errno.h's definition for each macro below.
54f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#define EWOULDBLOCK WSAEWOULDBLOCK
55dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#undef EINPROGRESS
56f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#define EINPROGRESS WSAEINPROGRESS
57dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#undef EALREADY
58f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#define EALREADY WSAEALREADY
59dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#undef ENOTSOCK
60f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#define ENOTSOCK WSAENOTSOCK
61dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#undef EDESTADDRREQ
62f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#define EDESTADDRREQ WSAEDESTADDRREQ
63dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#undef EMSGSIZE
64f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#define EMSGSIZE WSAEMSGSIZE
65dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#undef EPROTOTYPE
66f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#define EPROTOTYPE WSAEPROTOTYPE
67dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#undef ENOPROTOOPT
68f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#define ENOPROTOOPT WSAENOPROTOOPT
69dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#undef EPROTONOSUPPORT
70f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#define EPROTONOSUPPORT WSAEPROTONOSUPPORT
71dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#undef ESOCKTNOSUPPORT
72f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#define ESOCKTNOSUPPORT WSAESOCKTNOSUPPORT
73dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#undef EOPNOTSUPP
74f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#define EOPNOTSUPP WSAEOPNOTSUPP
75dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#undef EPFNOSUPPORT
76f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#define EPFNOSUPPORT WSAEPFNOSUPPORT
77dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#undef EAFNOSUPPORT
78f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#define EAFNOSUPPORT WSAEAFNOSUPPORT
79dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#undef EADDRINUSE
80f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#define EADDRINUSE WSAEADDRINUSE
81dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#undef EADDRNOTAVAIL
82f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#define EADDRNOTAVAIL WSAEADDRNOTAVAIL
83dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#undef ENETDOWN
84f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#define ENETDOWN WSAENETDOWN
85dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#undef ENETUNREACH
86f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#define ENETUNREACH WSAENETUNREACH
87dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#undef ENETRESET
88f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#define ENETRESET WSAENETRESET
89dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#undef ECONNABORTED
90f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#define ECONNABORTED WSAECONNABORTED
91dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#undef ECONNRESET
92f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#define ECONNRESET WSAECONNRESET
93dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#undef ENOBUFS
94f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#define ENOBUFS WSAENOBUFS
95dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#undef EISCONN
96f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#define EISCONN WSAEISCONN
97dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#undef ENOTCONN
98f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#define ENOTCONN WSAENOTCONN
99dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#undef ESHUTDOWN
100f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#define ESHUTDOWN WSAESHUTDOWN
101dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#undef ETOOMANYREFS
102f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#define ETOOMANYREFS WSAETOOMANYREFS
103dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#undef ETIMEDOUT
104f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#define ETIMEDOUT WSAETIMEDOUT
105dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#undef ECONNREFUSED
106f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#define ECONNREFUSED WSAECONNREFUSED
107dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#undef ELOOP
108f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#define ELOOP WSAELOOP
109dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#undef ENAMETOOLONG
110f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#define ENAMETOOLONG WSAENAMETOOLONG
111dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#undef EHOSTDOWN
112f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#define EHOSTDOWN WSAEHOSTDOWN
113dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#undef EHOSTUNREACH
114f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#define EHOSTUNREACH WSAEHOSTUNREACH
115dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#undef ENOTEMPTY
116f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#define ENOTEMPTY WSAENOTEMPTY
117dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#undef EPROCLIM
118f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#define EPROCLIM WSAEPROCLIM
119dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#undef EUSERS
120f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#define EUSERS WSAEUSERS
121dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#undef EDQUOT
122f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#define EDQUOT WSAEDQUOT
123dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#undef ESTALE
124f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#define ESTALE WSAESTALE
125dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#undef EREMOTE
126f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#define EREMOTE WSAEREMOTE
127f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#undef EACCES
128f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#define SOCKET_EACCES WSAEACCES
129dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#endif  // WIN32
130f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
131f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#ifdef POSIX
132f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#define INVALID_SOCKET (-1)
133f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#define SOCKET_ERROR (-1)
134f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#define closesocket(s) close(s)
135dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#endif  // POSIX
136f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
137f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochnamespace talk_base {
138f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
139f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochinline bool IsBlockingError(int e) {
140f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  return (e == EWOULDBLOCK) || (e == EAGAIN) || (e == EINPROGRESS);
141f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch}
142f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
143f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// General interface for the socket implementations of various networks.  The
144f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// methods match those of normal UNIX sockets very closely.
145f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass Socket {
146dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen public:
147f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual ~Socket() {}
148dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
149f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  // Returns the address to which the socket is bound.  If the socket is not
150f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  // bound, then the any-address is returned.
151f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual SocketAddress GetLocalAddress() const = 0;
152f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
153f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  // Returns the address to which the socket is connected.  If the socket is
154f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  // not connected, then the any-address is returned.
155f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual SocketAddress GetRemoteAddress() const = 0;
156f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
157f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual int Bind(const SocketAddress& addr) = 0;
158f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual int Connect(const SocketAddress& addr) = 0;
159f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual int Send(const void *pv, size_t cb) = 0;
160f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual int SendTo(const void *pv, size_t cb, const SocketAddress& addr) = 0;
161f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual int Recv(void *pv, size_t cb) = 0;
162f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual int RecvFrom(void *pv, size_t cb, SocketAddress *paddr) = 0;
163f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual int Listen(int backlog) = 0;
164f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual Socket *Accept(SocketAddress *paddr) = 0;
165f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual int Close() = 0;
166f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual int GetError() const = 0;
167f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual void SetError(int error) = 0;
168f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  inline bool IsBlocking() const { return IsBlockingError(GetError()); }
169f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
170f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  enum ConnState {
171f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch    CS_CLOSED,
172f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch    CS_CONNECTING,
173f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch    CS_CONNECTED
174f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  };
175f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual ConnState GetState() const = 0;
176f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
177f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  // Fills in the given uint16 with the current estimate of the MTU along the
178f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  // path to the address to which this socket is connected.
179f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual int EstimateMTU(uint16* mtu) = 0;
180f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
181f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  enum Option {
182f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch    OPT_DONTFRAGMENT,
183dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    OPT_RCVBUF,  // receive buffer size
184dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    OPT_SNDBUF,  // send buffer size
185dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    OPT_NODELAY  // whether Nagle algorithm is enabled
186f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  };
187f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual int GetOption(Option opt, int* value) = 0;
188f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual int SetOption(Option opt, int value) = 0;
189f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
190dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen protected:
191f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  Socket() {}
192f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
193dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen private:
194f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  DISALLOW_EVIL_CONSTRUCTORS(Socket);
195f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch};
196f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
197dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}  // namespace talk_base
198f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
199dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#endif  // TALK_BASE_SOCKET_H__
200