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