R=wu@webrtc.org Review URL: https://webrtc-codereview.appspot.com/2274004 git-svn-id: http://webrtc.googlecode.com/svn/trunk@4818 4adac7df-926f-26a2-2b94-8c16560cd09d
		
			
				
	
	
		
			203 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			203 lines
		
	
	
		
			6.1 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
 | 
						|
  };
 | 
						|
  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__
 |