unix_net.h
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:13k
源码类别:

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: unix_net.h,v 1.7.2.4 2004/07/09 01:46:54 hubbe Exp $
  3.  * 
  4.  * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
  5.  * 
  6.  * The contents of this file, and the files included with this file,
  7.  * are subject to the current version of the RealNetworks Public
  8.  * Source License (the "RPSL") available at
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed
  10.  * the file under the current version of the RealNetworks Community
  11.  * Source License (the "RCSL") available at
  12.  * http://www.helixcommunity.org/content/rcsl, in which case the RCSL
  13.  * will apply. You may also obtain the license terms directly from
  14.  * RealNetworks.  You may not use this file except in compliance with
  15.  * the RPSL or, if you have a valid RCSL with RealNetworks applicable
  16.  * to this file, the RCSL.  Please see the applicable RPSL or RCSL for
  17.  * the rights, obligations and limitations governing use of the
  18.  * contents of the file.
  19.  * 
  20.  * Alternatively, the contents of this file may be used under the
  21.  * terms of the GNU General Public License Version 2 or later (the
  22.  * "GPL") in which case the provisions of the GPL are applicable
  23.  * instead of those above. If you wish to allow use of your version of
  24.  * this file only under the terms of the GPL, and not to allow others
  25.  * to use your version of this file under the terms of either the RPSL
  26.  * or RCSL, indicate your decision by deleting the provisions above
  27.  * and replace them with the notice and other provisions required by
  28.  * the GPL. If you do not delete the provisions above, a recipient may
  29.  * use your version of this file under the terms of any one of the
  30.  * RPSL, the RCSL or the GPL.
  31.  * 
  32.  * This file is part of the Helix DNA Technology. RealNetworks is the
  33.  * developer of the Original Code and owns the copyrights in the
  34.  * portions it created.
  35.  * 
  36.  * This file, and the files included with this file, is distributed
  37.  * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
  38.  * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS
  39.  * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES
  40.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
  41.  * ENJOYMENT OR NON-INFRINGEMENT.
  42.  * 
  43.  * Technology Compatibility Kit Test Suite(s) Location:
  44.  *    http://www.helixcommunity.org/content/tck
  45.  * 
  46.  * Contributor(s):
  47.  * 
  48.  * ***** END LICENSE BLOCK ***** */
  49. #if !defined _HPUX && !defined _AIX43 && (!defined _MAC_UNIX || ( defined(_MAC_UNIX) && ( !defined(MAC_OS_X_VERSION_10_3) || (MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_3) ) ) )
  50. typedef unsigned int socklen_t;
  51. #endif
  52. #ifndef _UNIX_NET
  53. #define _UNIX_NET
  54. #include <stdio.h>
  55. #include <stdarg.h>
  56. #include <unistd.h>
  57. #ifndef _VXWORKS
  58. #include <sys/time.h>
  59. #include <sys/types.h>
  60. #include <sys/socket.h>
  61. #include <sys/ioctl.h>
  62. #include <netdb.h>
  63. #else
  64. #include <time.h>
  65. #include "sockLib.h"
  66. #include <ioLib.h>
  67. #ifndef fcntl
  68. #define fcntl ioctl
  69. #endif
  70. #include <fcntl.h>
  71. #endif
  72. #include <netinet/in.h>
  73. #ifndef _BEOS
  74. #include <arpa/inet.h>
  75. #endif
  76. #include <errno.h>
  77. #if defined ( _SOLARIS ) || defined ( _SUN )
  78. #include <sys/filio.h>                  // for FIONBIO
  79. #endif
  80. #include "sockio.h"
  81. #include "conn.h"
  82. #include "debug.h"
  83. #define INVALID_SOCKET -1
  84. const int nInvalidPipe = -1;
  85. struct IHXCallback;
  86. class CHXSimpleList;
  87. class unix_net : public conn 
  88. {
  89. public:  
  90.   ~unix_net (void);
  91.   
  92.   //  call new_socket() to automatically create the correct platform
  93.   // specific network object.  The type parameter may be either
  94.   // HX_TCP_SOCKET or HX_UDP_SOCKET. If new_socket() returns NULL,
  95.   // an error occurred and the conn object was not created. Call
  96.   // last_error() to get the error
  97.   static unix_net *new_socket (UINT16 type);
  98.   
  99.   // just for DNS for hostname...
  100.   // is introduced for RTSP...
  101.   virtual HX_RESULT dns_find_ip_addr (const char* host, UINT16 blocking=0);
  102.   virtual BOOL      dns_ip_addr_found(BOOL* valid, ULONG32* addr);     
  103.   
  104.   // call init_drivers() to do any platform specific initialization of
  105.   // the network drivers before calling any other functions in this
  106.   // class
  107.   static HX_RESULT init_drivers (void *params);
  108.   
  109.   // close_drivers() should close any network drivers used by the
  110.   // program NOTE: The program MUST not make any other calls to the
  111.   // network drivers until init_drivers() has been called 
  112.   static HX_RESULT close_drivers (void *params);
  113.  
  114.   // host_to_ip_str() converts the host name to an ASCII ip address of
  115.   // the form "XXX.XXX.XXX.XXX"
  116.   static HX_RESULT host_to_ip_str (char *host, char *ip, UINT32 ulIPBufLen);
  117.   // call done() when you are finished with the socket. Done() will
  118.   // close the socket.  You may reuse the socket by calling init()
  119.   // or connect() 
  120.   virtual void done (void);
  121.                 
  122.   static HX_RESULT get_host_name(char *name, int namelen);
  123.   static HX_RESULT get_host_by_name(char *name, REF(struct hostent*) pHostent);
  124.   virtual ULONG32 AddRef (void);
  125.   virtual ULONG32 Release (void);
  126.   virtual HX_RESULT init (UINT32 local_addr,
  127.   UINT16 port,
  128.   UINT16 blocking=0) =0;
  129.   
  130.   
  131.   virtual HX_RESULT init_unix (UINT16 type, 
  132.        UINT32 local_addr,
  133.        UINT16 port,
  134.        UINT16 blocking=0);
  135.                                                                                  
  136.   virtual HX_RESULT listen (UINT16 backlog);
  137.   virtual HX_RESULT listen (ULONG32 ulLocalAddr,
  138.     UINT16 port,
  139.     UINT16 backlog,
  140.     UINT16 blocking,
  141.     ULONG32 ulPlatform) =0;
  142.  
  143.                 
  144.   virtual HX_RESULT connect (const char *host, 
  145.      UINT16 port,
  146.      UINT16 blocking=0,
  147.      ULONG32 ulPlatform=0);
  148.         
  149.   virtual HX_RESULT connect (sockaddr_in *addr);
  150.   virtual HX_RESULT blocking (void);
  151.   virtual HX_RESULT CheckOnDNS(void);
  152.   
  153.   virtual HX_RESULT CheckForConnection(void);
  154.               
  155.   virtual HX_RESULT nonblocking (void);
  156.                 
  157.   virtual HX_RESULT read (void *buf, 
  158.   UINT16 *size);
  159.   virtual HX_RESULT readfrom (REF(IHXBuffer*)   pBuffer,
  160.       REF(UINT32)        ulAddress,
  161.       REF(UINT16)        ulPort);
  162.   virtual HX_RESULT write (void *buf,
  163.    UINT16 *size);
  164.   virtual HX_RESULT writeto (void *buf,
  165.      UINT16 *len,
  166.      ULONG32 addr,
  167.      UINT16 port);
  168.   /* some operation doesn't make sense for TCP */
  169.   virtual HX_RESULT join_multicast_group(ULONG32 addr, ULONG32 if_addr)
  170.   {
  171.     return HXR_INVALID_OPERATION;
  172.   }
  173.   virtual HX_RESULT leave_multicast_group(ULONG32 addr, ULONG32 if_addr)
  174.   {
  175.     return HXR_INVALID_OPERATION;
  176.   }
  177.   virtual HX_RESULT set_broadcast(BOOL enable)
  178.   {
  179.     return HXR_INVALID_OPERATION;
  180.   }  
  181.   virtual HX_RESULT set_multicast_if(ULONG32 ulInterface)
  182.   {
  183.     return HXR_INVALID_OPERATION;
  184.   }
  185.   virtual HX_RESULT set_send_size(ULONG32 send_size)
  186.   {
  187.     return HXR_INVALID_OPERATION;
  188.   }
  189.   virtual HX_RESULT set_multicast()
  190.   {
  191.       return HXR_INVALID_OPERATION;
  192.   }
  193.   virtual HX_RESULT set_multicast_ttl(unsigned char ttl)
  194.   {
  195.       return HXR_INVALID_OPERATION;
  196.   }
  197.   virtual HX_RESULT reuse_addr(BOOL enable);
  198.   virtual HX_RESULT reuse_port(BOOL enable);
  199.   
  200.   virtual ULONG32 get_addr (void);
  201.   virtual UINT16  get_local_port (void);
  202.   virtual HX_RESULT accept (sockaddr_in *addr, HX_SOCKLEN_T *addrlen);
  203.   virtual HX_RESULT connect_accept(sockaddr_in *addr);
  204.   virtual HX_RESULT bind (sockaddr_in *addr);
  205.   void set_callback     (IHXCallback* pCallback);
  206.         
  207.   HX_RESULT WriteComplete (char * Buffer, int length);
  208.   int ReadyToWrite ();
  209.   // Callbacks from our Async Net notifier object
  210.   void CB_DNSComplete( int iSuccess );
  211.   void CB_ConnectionComplete( int iSuccess );
  212.   void CB_ReadWriteNotification( int iType );
  213.   void CB_CloseNotification();
  214.   void CB_NewConnectionReady(int iSuccess, unix_net* pConn);
  215.   void add_read_request();
  216.   static void process_idle();
  217.   void add_select(int *, fd_set*, fd_set*, fd_set*);
  218.   void process_select(int, fd_set*, fd_set*, fd_set*);
  219.   BOOL read_pending;
  220.   HX_RESULT ConnectAsync( const char* host, UINT16 port );
  221.   void ContinueAsyncConnect();
  222.   
  223.   // Handle to any active Async DNS type operations. Usually NULL meaning
  224.   // no such operations are active.
  225.   // HANDLE m_hAsyncHandle;
  226.   
  227.   //Helper method for async debugging.
  228.   const int GetSocketState() const
  229.   {
  230.     return m_SocketState;
  231.   }
  232.   
  233. protected:
  234.   unix_net (void); 
  235.   HX_RESULT DoStartAsyncConn();
  236.   void      CleanUpChildProc();
  237.   
  238.   char*       m_pInBuffer;
  239.   int         callRaConnect;                                    
  240.   static int  InBlockingMode; 
  241.   int         bReadyToWrite;
  242.   static CHXSimpleList* readers;
  243.   typedef enum tagCONN_STATE
  244.   {
  245.     CONN_CLOSED = 0, // Socket not readable or writeable
  246.     CONN_NO_CONN,    // Socket needs to be connected (TCP)
  247.     CONN_DNS_INPROG, // DNS is in progress reads/writes will return
  248.                      // HX_WOULDBLOCK
  249.     CONN_DNS_FAILED, // Error doing DNS (return HXR_INVALID_HOST error
  250.                      // next read or write)
  251.     CONN_CONNECT_INPROG, // DNS is complete, but the connection not
  252.                          // complete
  253.     CONN_CONNECT_FAILED, // Error doing Connect (return error next
  254.                          // read or write)
  255.     CONN_OPEN,    // Socket readable/writeable
  256.     CONN_CLOSING, // Socket is shutdown, reading might work, writing
  257.                   // will fail
  258.     CONN_LISTENNING, // Socket is listenning for connectionsa
  259.     CONN_BOGUS_STATE // NOT A VALID SOCKET STATE - USED FOR RANGE
  260.                      // CHECKING AT MOST
  261.   } CONN_STATE;
  262.   //Vars for Async DNS.
  263.   UINT16       m_AsyncPort;
  264.   char*         m_pAsyncHost;
  265.   int         m_anDNSPipe[2];
  266.   int          m_nChildProcID;
  267.   struct sockaddr_in m_sSockAddrIn;
  268.   BOOL               m_DNSOnly; //Used for DNS only objects.
  269.   char               m_szPipeIP[20]; /* Flawfinder: ignore */ //big enough to hold "255.255.255.255"
  270.   
  271. #ifdef _UNIX_THREADS_SUPPORTED
  272.   //On threaded network IO builds we are going to use a thread
  273.   //instead of a fork to do async DNS.
  274.   int                m_nResolved;
  275.   HXThread*         m_pResolver;
  276.   static void *_ResolveIt( void* pArg );
  277. #endif  
  278.   CONN_STATE m_SocketState;
  279.   // stores addr about where we are connected to currently
  280.   ULONG32 CurrentAddr;  
  281.   LONG32  m_lRefCount;
  282.     BOOL m_bReuseAddr;
  283.     BOOL m_bReusePort;
  284. };
  285. class unix_UDP: public unix_net 
  286. {
  287.   public :
  288.   HX_RESULT init(UINT32 local_addr, UINT16 port, 
  289.  UINT16 blocking=0)
  290.   {        
  291.     callRaConnect = 0;
  292.     return unix_net::init_unix( SOCK_DGRAM, local_addr, port, blocking);
  293.   };
  294.   HX_RESULT connect( const char* host,
  295.      UINT16 port,
  296.      UINT16  blocking=0,
  297.      ULONG32 ulPlatform = 0
  298.      );
  299.   HX_RESULT connect( sockaddr_in *addr, UINT16 blocking=0);
  300.   HX_RESULT join_multicast_group(ULONG32 addr, ULONG32 if_addr);
  301.   HX_RESULT leave_multicast_group(ULONG32 addr, ULONG32 if_addr);
  302.   HX_RESULT set_broadcast(BOOL enable);
  303.   HX_RESULT set_multicast_if(ULONG32 ulInterface);
  304.   HX_RESULT set_send_size(UINT32 send_size);
  305.   HX_RESULT set_multicast();
  306.   HX_RESULT set_multicast_ttl(unsigned char ttl);
  307.   HX_RESULT listen( ULONG32 ulLocalAddr,
  308.     UINT16 port,
  309.     UINT16 backlog,
  310.     UINT16 blocking=1,
  311.     ULONG32 ulPlatform=0
  312.     )
  313.   {
  314.     // listening on a UDP port is not supported...
  315.     return HXR_NOTIMPL;
  316.   }
  317. };
  318. class unix_TCP: public unix_net {
  319.   public :
  320.   HX_RESULT init(UINT32 local_addr, UINT16 port, 
  321.  UINT16 blocking=1)
  322.   {
  323.     return unix_net::init_unix(SOCK_STREAM, local_addr, port,  
  324.                                blocking);
  325.   };
  326.   HX_RESULT connect(const char* host, UINT16 port, UINT16 blocking=0, ULONG32 ulPlatform = 0 );
  327.   HX_RESULT connect(sockaddr_in *addr, UINT16 blocking=1);
  328.   HX_RESULT listen (ULONG32 ulLocalAddr, UINT16 port, UINT16 backlog, UINT16 blocking=0, ULONG32 ulPlatform=0);
  329. };
  330. inline HX_RESULT unix_net::blocking (void)
  331. {
  332.   int rtn;
  333. #ifdef FIONBIO
  334.   unsigned long nonblocking = 0;
  335.   rtn = ::ioctl(get_sock(), FIONBIO, (char*)&nonblocking); 
  336. #elif SO_NONBLOCK
  337.     char nonblocking = 0;
  338.     rtn = ::setsockopt(get_sock(),SOL_SOCKET,SO_NONBLOCK,&nonblocking,1);
  339. #else
  340.     rtn = ::fcntl(get_sock(), F_SETFL, ::fcntl(get_sock(), F_GETFL, 0) & ~O_NONBLOCK);
  341. #endif
  342.   if (rtn == 0)
  343.     return HXR_OK;
  344.   else if (errno == EBADF)
  345.     return HXR_NET_SOCKET_INVALID;
  346.   else if (errno == EINVAL)
  347.     return HXR_INVALID_OPERATION;
  348.   return HXR_INVALID_OPERATION;
  349. }
  350.     
  351. inline HX_RESULT unix_net::nonblocking (void) 
  352. {
  353.   int rtn;
  354. #ifdef FIONBIO
  355.   unsigned long nonblocking = 1;
  356.   rtn = ::ioctl(get_sock(), FIONBIO, (char*)&nonblocking); 
  357. #elif SO_NONBLOCK
  358.     char nonblocking = 1;
  359.     rtn = ::setsockopt(get_sock(),SOL_SOCKET,SO_NONBLOCK,&nonblocking,1);
  360. #else
  361.     rtn = ::fcntl(get_sock(), F_SETFL, ::fcntl(get_sock(), F_GETFL, 0) | O_NONBLOCK);
  362. #endif
  363.   if (rtn == 0)
  364.     return HXR_OK;
  365.   else if (errno == EBADF)
  366.     return HXR_NET_SOCKET_INVALID;
  367.   else if (errno == EINVAL)
  368.     return HXR_INVALID_OPERATION;
  369.   return HXR_INVALID_OPERATION;
  370. }
  371. inline HX_RESULT unix_net::accept (sockaddr_in *addr, HX_SOCKLEN_T *addrlen)
  372. {
  373.   return ::accept(get_sock(), (sockaddr*)addr, addrlen);
  374. }
  375.                                          
  376. inline HX_RESULT unix_net::bind (sockaddr_in *addr)
  377. {
  378.   return ::bind(get_sock(), (sockaddr*)addr, sizeof(addr));
  379. }
  380. #endif // _UNIX_NET