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