⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 socketcollection.h

📁 编译工具
💻 H
字号:
// -*- Mode: C++; -*-//                            Package   : omniORB// SocketCollection.h         Created on: 23 Jul 2001//                            Author    : Sai Lai Lo (sll)////    Copyright (C) 2001 AT&T Laboratories Cambridge////    This file is part of the omniORB library////    The omniORB library is free software; you can redistribute it and/or//    modify it under the terms of the GNU Library General Public//    License as published by the Free Software Foundation; either//    version 2 of the License, or (at your option) any later version.////    This library is distributed in the hope that it will be useful,//    but WITHOUT ANY WARRANTY; without even the implied warranty of//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU//    Library General Public License for more details.////    You should have received a copy of the GNU Library General Public//    License along with this library; if not, write to the Free//    Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA//    02111-1307, USA////// Description://	*** PROPRIETORY INTERFACE ***///*  $Log: SocketCollection.h,v $  Revision 1.1.2.22  2005/03/10 11:28:30  dgrisby  Race condition between setSelectable / clearSelectable.  Revision 1.1.2.21  2004/10/18 11:47:02  dgrisby  accept() error handling didn't work on MacOS X.  Revision 1.1.2.20  2004/10/17 22:27:23  dgrisby  Handle errors in accept() properly. Thanks Kamaldeep Singh Khanuja and  Jeremy Van Grinsven.  Revision 1.1.2.19  2004/10/17 20:14:28  dgrisby  Updated support for OpenVMS. Many thanks to Bruce Visscher.  Revision 1.1.2.18  2004/04/08 10:02:19  dgrisby  In thread pool mode, close connections that will not be selectable.  Revision 1.1.2.17  2003/11/12 16:04:18  dgrisby  Set sockets to close on exec.  Revision 1.1.2.16  2003/02/17 01:45:50  dgrisby  Pipe to kick select thread (on Unix).  Revision 1.1.2.15  2002/10/04 11:11:45  dgrisby  Transport fixes: ENOTSOCK for Windows, SOMAXCONN in listen().  Revision 1.1.2.14  2002/09/08 22:12:22  dgrisby  Last checkin broke it.  Revision 1.1.2.13  2002/09/08 21:58:49  dgrisby  Support for MSVC 7. (Untested.)  Revision 1.1.2.12  2002/08/21 06:23:15  dgrisby  Properly clean up bidir connections and ropes. Other small tweaks.  Revision 1.1.2.11  2002/05/07 12:54:38  dgrisby  Fix inevitable Windows header brokenness.  Revision 1.1.2.10  2002/04/28 20:43:25  dgrisby  Windows, FreeBSD, ETS fixes.  Revision 1.1.2.9  2002/03/13 16:05:38  dpg1  Transport shutdown fixes. Reference count SocketCollections to avoid  connections using them after they are deleted. Properly close  connections when in thread pool mode.  Revision 1.1.2.8  2002/02/26 14:06:44  dpg1  Recent changes broke Windows.  Revision 1.1.2.7  2002/02/13 16:02:38  dpg1  Stability fixes thanks to Bastiaan Bakker, plus threading  optimisations inspired by investigating Bastiaan's bug reports.  Revision 1.1.2.6  2002/01/15 16:38:11  dpg1  On the road to autoconf. Dependencies refactored, configure.ac  written. No makefiles yet.  Revision 1.1.2.5  2001/12/03 13:39:54  dpg1  Explicit socket shutdown flag for Windows.  Revision 1.1.2.4  2001/08/24 16:43:25  sll  Switch to use Winsock 2. Removed reference to winsock.h. Let the pre-processor  define _WIN32_WINNT=0x0400 to select the right header.  Revision 1.1.2.3  2001/08/23 16:03:29  sll  Corrected typo __win32__, should be __WIN32__.  Revision 1.1.2.2  2001/08/23 10:13:14  sll  Cope with the different length type for getsockname and friends on  different solaris versions.  Revision 1.1.2.1  2001/07/31 16:16:26  sll  New transport interface to support the monitoring of active connections.*/#ifndef __SOCKETCOLLECTION_H__#define __SOCKETCOLLECTION_H__//////////////////////////////////////////////////////////////////////////  Platform feature selection#define SOCKNAME_SIZE_T OMNI_SOCKNAME_SIZE_T#define USE_NONBLOCKING_CONNECT#if defined(__linux__)#   define USE_POLL#endif#if defined(__sunos__)#   define USE_POLL#endif#if defined(__hpux__)#   if __OSVERSION__ >= 11#       define USE_POLL#   endif#   define USE_FAKE_INTERRUPTABLE_RECV#endif#if defined(__freebsd__)#  define USE_POLL#endif#if defined(__WIN32__)#   define USE_FAKE_INTERRUPTABLE_RECV#endif#if defined(__irix__)#   define USE_POLL#endif//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////             win32 API//#if defined(__WIN32__)#  include <sys/types.h>#  include <libcWrapper.h>#  define RC_INADDR_NONE     INADDR_NONE#  define RC_INVALID_SOCKET  INVALID_SOCKET#  define RC_SOCKET_ERROR    SOCKET_ERROR#  define INETSOCKET         PF_INET#  define CLOSESOCKET(sock)  closesocket(sock)#  define SHUTDOWNSOCKET(sock) ::shutdown(sock,2)#  define ERRNO              ::WSAGetLastError()#  define EINPROGRESS        WSAEWOULDBLOCK#  define RC_EINTR           WSAEINTR#  define RC_EBADF           WSAENOTSOCK#  define NEED_SOCKET_SHUTDOWN_FLAG 1OMNI_NAMESPACE_BEGIN(omni)typedef SOCKET SocketHandle_t;typedef fd_set SocketHandleSet_t;OMNI_NAMESPACE_END(omni)#else//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////             unix(ish)//#  if defined(__vxWorks__)#    include <sockLib.h>#    include <hostLib.h>#    include <ioLib.h>#    include <netinet/tcp.h>#  else#    include <sys/time.h>#  endif#  include <sys/socket.h>#  include <netinet/in.h>#  include <netinet/tcp.h>#  include <arpa/inet.h>#  include <unistd.h>#  include <sys/types.h>#  include <errno.h>#  include <libcWrapper.h>#  if defined(USE_POLL)#    include <poll.h>#  endif#  include <fcntl.h>#  if defined (__uw7__)#    ifdef shutdown#      undef shutdown#    endif#  endif#  if defined(__VMS) && defined(USE_tcpSocketVaxRoutines)#    include "tcpSocketVaxRoutines.h"#    undef accept#    undef recv#    undef send#    define accept(a,b,c) tcpSocketVaxAccept(a,b,c)#    define recv(a,b,c,d) tcpSocketVaxRecv(a,b,c,d)#    define send(a,b,c,d) tcpSocketVaxSend(a,b,c,d)#  endif#  ifdef __rtems__extern "C" int select (int,fd_set*,fd_set*,fd_set*,struct timeval *);#  endif#  define RC_INADDR_NONE     ((CORBA::ULong)-1)#  define RC_INVALID_SOCKET  (-1)#  define RC_SOCKET_ERROR    (-1)#  define INETSOCKET         AF_INET#  define CLOSESOCKET(sock)   close(sock)#  if defined(__sunos__) && defined(__sparc__) && __OSVERSION__ >= 5#    define SHUTDOWNSOCKET(sock)  ::shutdown(sock,2)#  elif defined(__osf1__) && defined(__alpha__)#    define SHUTDOWNSOCKET(sock)  ::shutdown(sock,2)#  else     // XXX none of the above, calling shutdown() may not have the     // desired effect.#    define SHUTDOWNSOCKET(sock)  ::shutdown(sock,2)#  endif#  define ERRNO              errno#  define RC_EINTR           EINTR#  define RC_EBADF           EBADF#  define RC_EAGAIN          EAGAINOMNI_NAMESPACE_BEGIN(omni)typedef int    SocketHandle_t;typedef fd_set SocketHandleSet_t;OMNI_NAMESPACE_END(omni)#endif#if defined(NEED_GETHOSTNAME_PROTOTYPE)extern "C" int gethostname(char *name, int namelen);#endifOMNI_NAMESPACE_BEGIN(omni)class SocketCollection;extern void SocketSetTimeOut(unsigned long abs_sec,			     unsigned long abs_nsec,struct timeval& t);extern int SocketSetnonblocking(SocketHandle_t sock);extern int SocketSetblocking(SocketHandle_t sock);extern int SocketSetCloseOnExec(SocketHandle_t sock);class SocketLink {public:  SocketLink(SocketHandle_t s)    : pd_socket(s),#ifdef NEED_SOCKET_SHUTDOWN_FLAG      pd_shutdown(0),#endif      pd_next(0) {}  ~SocketLink() {}  friend class SocketCollection;protected:  SocketHandle_t pd_socket;#ifdef NEED_SOCKET_SHUTDOWN_FLAG  // select() on Windows does not return an error after the socket has  // shutdown, so we have to store an extra flag here.  CORBA::Boolean pd_shutdown;#endifprivate:  SocketLink*    pd_next;};class SocketCollection {public:  SocketCollection();protected:  virtual ~SocketCollection();  virtual CORBA::Boolean notifyReadable(SocketHandle_t) = 0;  // Callback used by Select(). This method is called while holding  // pd_fdset_lock.public:  void setSelectable(SocketHandle_t sock, int now,		     CORBA::Boolean data_in_buffer,		     CORBA::Boolean hold_lock=0);  // Indicates that this socket should be watched by a select()  // so that any new data arriving on the connection will be noted.  // If now == 1, immediately make this socket part of the select  // set (if the platforms allows it).  // If now == 2, immediately make this connection part of the select  // set, but only if it is already marked selectable.  // If data_in_buffer == 1, treat this socket as if there are  // data available from the connection already.  // If hold_lock == 1, pd_fdset_lock is already held.  void clearSelectable(SocketHandle_t);  // Indicates that this connection need not be watched any more.  CORBA::Boolean isSelectable(SocketHandle_t sock);  // Indicates whether the given socket can be selected upon.  CORBA::Boolean Select();  // Returns TRUE(1) if the Select() has successfully done a scan.  // otherwise returns false(0) to indicate that an error has been  // detected and this function should not be called again.  //  // For each of the sockets that has been marked watchable and indeed  // has become readable, call notifyReadable() with the socket no.  // as the argument.  CORBA::Boolean Peek(SocketHandle_t sock);  // Do nothing and returns immediately if the socket has not been  // set to be watched by a previous setSelectable().  // Otherwise, monitor the socket's status for a short time.  // Returns TRUE(1) if the socket becomes readable.  // otherwise returns FALSE(0).  void incrRefCount();  void decrRefCount();  void addSocket(SocketLink* conn);  // Add this socket to the collection. <conn> is associated with the  // socket and should be added to the table hashed by the socket number.  // Increments this collection's refcount.  SocketLink* removeSocket(SocketHandle_t sock);  // Remove the socket from this collection. Return the socket which has  // been removed. Return 0 if the socket is not found.  // Decrements this collection's refcount if a socket is removed.  SocketLink* findSocket(SocketHandle_t sock,			 CORBA::Boolean hold_lock=0);  // Returns the connection that is associated with this socket.  // Return 0 if this socket cannot be found in the hash table.  // if hold_lock == 1, the caller has already got the lock on pd_fdset_lock.  // (use purely by member functions.)  static unsigned long scan_interval_sec;  static unsigned long scan_interval_nsec;  static CORBA::ULong  hashsize;private:  SocketHandleSet_t    pd_fdset_1;  SocketHandleSet_t    pd_fdset_2;  SocketHandleSet_t    pd_fdset_dib; // data in buffer  int                  pd_n_fdset_1;  int                  pd_n_fdset_2;  int                  pd_n_fdset_dib;  omni_tracedmutex     pd_fdset_lock;  omni_tracedcondition pd_select_cond; // timedwait on if nothing to select  unsigned long        pd_abs_sec;  unsigned long        pd_abs_nsec;  int                  pd_pipe_read;  int                  pd_pipe_write;  CORBA::Boolean       pd_pipe_full;  int                  pd_refcount;protected:  SocketLink**         pd_hash_table;};OMNI_NAMESPACE_END(omni)#endif // __SOCKETCOLLECTION_H__

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -