 b9a088b920
			
		
	
	b9a088b920
	
	
	
		
			
			TBR=mallinath Review URL: https://webrtc-codereview.appspot.com/8669005 git-svn-id: http://webrtc.googlecode.com/svn/trunk@5548 4adac7df-926f-26a2-2b94-8c16560cd09d
		
			
				
	
	
		
			206 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			206 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|  * libjingle
 | |
|  * Copyright 2004--2005, Google Inc.
 | |
|  *
 | |
|  * Redistribution and use in source and binary forms, with or without
 | |
|  * modification, are permitted provided that the following conditions are met:
 | |
|  *
 | |
|  *  1. Redistributions of source code must retain the above copyright notice,
 | |
|  *     this list of conditions and the following disclaimer.
 | |
|  *  2. Redistributions in binary form must reproduce the above copyright notice,
 | |
|  *     this list of conditions and the following disclaimer in the documentation
 | |
|  *     and/or other materials provided with the distribution.
 | |
|  *  3. The name of the author may not be used to endorse or promote products
 | |
|  *     derived from this software without specific prior written permission.
 | |
|  *
 | |
|  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
 | |
|  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 | |
|  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
 | |
|  * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | |
|  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 | |
|  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
 | |
|  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 | |
|  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 | |
|  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
 | |
|  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | |
|  */
 | |
| 
 | |
| #ifndef TALK_BASE_SOCKET_H__
 | |
| #define TALK_BASE_SOCKET_H__
 | |
| 
 | |
| #include <errno.h>
 | |
| 
 | |
| #ifdef POSIX
 | |
| #include <sys/types.h>
 | |
| #include <sys/socket.h>
 | |
| #include <arpa/inet.h>
 | |
| #include <netinet/in.h>
 | |
| #define SOCKET_EACCES EACCES
 | |
| #endif
 | |
| 
 | |
| #ifdef WIN32
 | |
| #include "talk/base/win32.h"
 | |
| #endif
 | |
| 
 | |
| #include "talk/base/basictypes.h"
 | |
| #include "talk/base/socketaddress.h"
 | |
| 
 | |
| // Rather than converting errors into a private namespace,
 | |
| // Reuse the POSIX socket api errors. Note this depends on
 | |
| // Win32 compatibility.
 | |
| 
 | |
| #ifdef WIN32
 | |
| #undef EWOULDBLOCK  // Remove errno.h's definition for each macro below.
 | |
| #define EWOULDBLOCK WSAEWOULDBLOCK
 | |
| #undef EINPROGRESS
 | |
| #define EINPROGRESS WSAEINPROGRESS
 | |
| #undef EALREADY
 | |
| #define EALREADY WSAEALREADY
 | |
| #undef ENOTSOCK
 | |
| #define ENOTSOCK WSAENOTSOCK
 | |
| #undef EDESTADDRREQ
 | |
| #define EDESTADDRREQ WSAEDESTADDRREQ
 | |
| #undef EMSGSIZE
 | |
| #define EMSGSIZE WSAEMSGSIZE
 | |
| #undef EPROTOTYPE
 | |
| #define EPROTOTYPE WSAEPROTOTYPE
 | |
| #undef ENOPROTOOPT
 | |
| #define ENOPROTOOPT WSAENOPROTOOPT
 | |
| #undef EPROTONOSUPPORT
 | |
| #define EPROTONOSUPPORT WSAEPROTONOSUPPORT
 | |
| #undef ESOCKTNOSUPPORT
 | |
| #define ESOCKTNOSUPPORT WSAESOCKTNOSUPPORT
 | |
| #undef EOPNOTSUPP
 | |
| #define EOPNOTSUPP WSAEOPNOTSUPP
 | |
| #undef EPFNOSUPPORT
 | |
| #define EPFNOSUPPORT WSAEPFNOSUPPORT
 | |
| #undef EAFNOSUPPORT
 | |
| #define EAFNOSUPPORT WSAEAFNOSUPPORT
 | |
| #undef EADDRINUSE
 | |
| #define EADDRINUSE WSAEADDRINUSE
 | |
| #undef EADDRNOTAVAIL
 | |
| #define EADDRNOTAVAIL WSAEADDRNOTAVAIL
 | |
| #undef ENETDOWN
 | |
| #define ENETDOWN WSAENETDOWN
 | |
| #undef ENETUNREACH
 | |
| #define ENETUNREACH WSAENETUNREACH
 | |
| #undef ENETRESET
 | |
| #define ENETRESET WSAENETRESET
 | |
| #undef ECONNABORTED
 | |
| #define ECONNABORTED WSAECONNABORTED
 | |
| #undef ECONNRESET
 | |
| #define ECONNRESET WSAECONNRESET
 | |
| #undef ENOBUFS
 | |
| #define ENOBUFS WSAENOBUFS
 | |
| #undef EISCONN
 | |
| #define EISCONN WSAEISCONN
 | |
| #undef ENOTCONN
 | |
| #define ENOTCONN WSAENOTCONN
 | |
| #undef ESHUTDOWN
 | |
| #define ESHUTDOWN WSAESHUTDOWN
 | |
| #undef ETOOMANYREFS
 | |
| #define ETOOMANYREFS WSAETOOMANYREFS
 | |
| #undef ETIMEDOUT
 | |
| #define ETIMEDOUT WSAETIMEDOUT
 | |
| #undef ECONNREFUSED
 | |
| #define ECONNREFUSED WSAECONNREFUSED
 | |
| #undef ELOOP
 | |
| #define ELOOP WSAELOOP
 | |
| #undef ENAMETOOLONG
 | |
| #define ENAMETOOLONG WSAENAMETOOLONG
 | |
| #undef EHOSTDOWN
 | |
| #define EHOSTDOWN WSAEHOSTDOWN
 | |
| #undef EHOSTUNREACH
 | |
| #define EHOSTUNREACH WSAEHOSTUNREACH
 | |
| #undef ENOTEMPTY
 | |
| #define ENOTEMPTY WSAENOTEMPTY
 | |
| #undef EPROCLIM
 | |
| #define EPROCLIM WSAEPROCLIM
 | |
| #undef EUSERS
 | |
| #define EUSERS WSAEUSERS
 | |
| #undef EDQUOT
 | |
| #define EDQUOT WSAEDQUOT
 | |
| #undef ESTALE
 | |
| #define ESTALE WSAESTALE
 | |
| #undef EREMOTE
 | |
| #define EREMOTE WSAEREMOTE
 | |
| #undef EACCES
 | |
| #define SOCKET_EACCES WSAEACCES
 | |
| #endif  // WIN32
 | |
| 
 | |
| #ifdef POSIX
 | |
| #define INVALID_SOCKET (-1)
 | |
| #define SOCKET_ERROR (-1)
 | |
| #define closesocket(s) close(s)
 | |
| #endif  // POSIX
 | |
| 
 | |
| namespace talk_base {
 | |
| 
 | |
| inline bool IsBlockingError(int e) {
 | |
|   return (e == EWOULDBLOCK) || (e == EAGAIN) || (e == EINPROGRESS);
 | |
| }
 | |
| 
 | |
| // General interface for the socket implementations of various networks.  The
 | |
| // methods match those of normal UNIX sockets very closely.
 | |
| class Socket {
 | |
|  public:
 | |
|   virtual ~Socket() {}
 | |
| 
 | |
|   // Returns the address to which the socket is bound.  If the socket is not
 | |
|   // bound, then the any-address is returned.
 | |
|   virtual SocketAddress GetLocalAddress() const = 0;
 | |
| 
 | |
|   // Returns the address to which the socket is connected.  If the socket is
 | |
|   // not connected, then the any-address is returned.
 | |
|   virtual SocketAddress GetRemoteAddress() const = 0;
 | |
| 
 | |
|   virtual int Bind(const SocketAddress& addr) = 0;
 | |
|   virtual int Connect(const SocketAddress& addr) = 0;
 | |
|   virtual int Send(const void *pv, size_t cb) = 0;
 | |
|   virtual int SendTo(const void *pv, size_t cb, const SocketAddress& addr) = 0;
 | |
|   virtual int Recv(void *pv, size_t cb) = 0;
 | |
|   virtual int RecvFrom(void *pv, size_t cb, SocketAddress *paddr) = 0;
 | |
|   virtual int Listen(int backlog) = 0;
 | |
|   virtual Socket *Accept(SocketAddress *paddr) = 0;
 | |
|   virtual int Close() = 0;
 | |
|   virtual int GetError() const = 0;
 | |
|   virtual void SetError(int error) = 0;
 | |
|   inline bool IsBlocking() const { return IsBlockingError(GetError()); }
 | |
| 
 | |
|   enum ConnState {
 | |
|     CS_CLOSED,
 | |
|     CS_CONNECTING,
 | |
|     CS_CONNECTED
 | |
|   };
 | |
|   virtual ConnState GetState() const = 0;
 | |
| 
 | |
|   // Fills in the given uint16 with the current estimate of the MTU along the
 | |
|   // path to the address to which this socket is connected. NOTE: This method
 | |
|   // can block for up to 10 seconds on Windows.
 | |
|   virtual int EstimateMTU(uint16* mtu) = 0;
 | |
| 
 | |
|   enum Option {
 | |
|     OPT_DONTFRAGMENT,
 | |
|     OPT_RCVBUF,      // receive buffer size
 | |
|     OPT_SNDBUF,      // send buffer size
 | |
|     OPT_NODELAY,     // whether Nagle algorithm is enabled
 | |
|     OPT_IPV6_V6ONLY, // Whether the socket is IPv6 only.
 | |
|     OPT_DSCP,        // DSCP code
 | |
|     OPT_RTP_SENDTIME_EXTN_ID,  // This is a non-traditional socket option param.
 | |
|                                // This is specific to libjingle and will be used
 | |
|                                // if SendTime option is needed at socket level.
 | |
|   };
 | |
|   virtual int GetOption(Option opt, int* value) = 0;
 | |
|   virtual int SetOption(Option opt, int value) = 0;
 | |
| 
 | |
|  protected:
 | |
|   Socket() {}
 | |
| 
 | |
|  private:
 | |
|   DISALLOW_EVIL_CONSTRUCTORS(Socket);
 | |
| };
 | |
| 
 | |
| }  // namespace talk_base
 | |
| 
 | |
| #endif  // TALK_BASE_SOCKET_H__
 |