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