Gizmo3D

gzNetwork.h

Go to the documentation of this file.
00001 // *****************************************************************************
00002 // File         : gzNetwork.h
00003 // Module       : gzBase
00004 // Description  : Class definition of Network classes
00005 // Author       : Anders Modén      
00006 // Product      : GizmoBase 2.1.1
00007 //      
00008 // Copyright © 2003- Saab Training System AB, Sweden
00009 //          
00010 // NOTE:    GizmoBase is a platform abstraction utility layer for C++. It contains 
00011 //          design patterns and C++ solutions for the advanced programmer.
00012 //
00013 //
00014 // Revision History...                          
00015 //                                  
00016 // Who  Date    Description                     
00017 //                                  
00018 // AMO  010404  Created file    
00019 //
00020 // ******************************************************************************
00021 
00022 #ifndef __GZ_NETWORK_H__
00023 #define __GZ_NETWORK_H__
00024 
00025 #include "gzBasicTypes.h"
00026 #include "gzMemory.h"
00027 #include "gzDynamic.h"
00028 #include "gzThread.h"
00029 #include "gzNotify.h"
00030 
00031 
00038 #ifdef WIN32
00039     typedef UINT_PTR    gzSocketHandle;
00040 #else
00041     typedef gzLong      gzSocketHandle;
00042 #endif
00043 
00044 
00046 enum gzSocketFamily
00047 {
00048     GZ_SOCKET_FAMILY_INET,  
00049     GZ_SOCKET_FAMILY_IRDA,  
00050     GZ_SOCKET_FAMILY_INET6  
00051 };
00052 
00053 
00055 enum gzSocketType
00056 {
00057     GZ_SOCKET_TYPE_STREAM,
00058     GZ_SOCKET_TYPE_DATAGRAM
00059 };
00060 
00061 
00063 enum gzSocketOption
00064 {
00065     GZ_SOCKET_OPTION_BROADCAST,                 
00066     GZ_SOCKET_OPTION_DONTROUTE,
00067     GZ_SOCKET_OPTION_USE_LINGER,                
00068     GZ_SOCKET_OPTION_DONT_USE_LINGER,           
00069     GZ_SOCKET_OPTION_KEEPALIVE,
00070     GZ_SOCKET_OPTION_REUSE_ADDR_PORT,
00071     GZ_SOCKET_OPTION_MULTICAST_TTL,
00072     GZ_SOCKET_OPTION_MULTICAST_INTERFACE,
00073     GZ_SOCKET_OPTION_MULTICAST_LOOPBACK,
00074     GZ_SOCKET_OPTION_ADD_MULTICAST_MEMBERSHIP,
00075     GZ_SOCKET_OPTION_DROP_MULTICAST_MEMBERSHIP,
00076     GZ_SOCKET_OPTION_RECEIVE_BUFFER,            
00077     GZ_SOCKET_OPTION_SEND_BUFFER,               
00078     GZ_SOCKET_OPTION_RECEIVE_TIMEOUT,           
00079 };
00080 
00081 
00083 enum gzSocketError
00084 {
00085     GZ_SOCKET_ERROR_NO_ERROR = 0,
00086     GZ_SOCKET_ERROR_CHECK_FOR_ERROR,
00087     GZ_SOCKET_ERROR_UNKNOWN_ERROR,
00088     GZ_SOCKET_ERROR_PROTOCOL_FAMILY_NOT_SUPPORTED,
00089     GZ_SOCKET_ERROR_ADDRESS_FAMILY_NOT_SUPPORTED,
00090     GZ_SOCKET_ERROR_PERMISSION_DENIED,
00091     GZ_SOCKET_ERROR_PROTOCOL_NOT_SUPPORTED,
00092     GZ_SOCKET_ERROR_NETWORK_NOT_INITIALISED,
00093     GZ_SOCKET_ERROR_CONNECTION_CLOSED,
00094     GZ_SOCKET_ERROR_UNKNOWN_SOCKET_OPTION,
00095     GZ_SOCKET_ERROR_SOCKET_NOT_CONFIGURED,
00096     GZ_SOCKET_ERROR_HOST_UNREACHABLE,
00097     GZ_SOCKET_ERROR_NETWORK_UNREACHABLE,
00098     GZ_SOCKET_ERROR_OPTION_NOT_SUPPORTED,
00099     GZ_SOCKET_ERROR_INVALID_DESCRIPTOR,
00100     GZ_SOCKET_ERROR_INVALID_ARGUMENT,
00101     GZ_SOCKET_ERROR_ADDRESS_IN_USE,
00102     GZ_SOCKET_ERROR_ADDRESS_NOT_AVAILABLE,
00103     GZ_SOCKET_ERROR_IS_CONNECTED,
00104     GZ_SOCKET_ERROR_NOT_CONNECTED,
00105     GZ_SOCKET_ERROR_CONNECTION_RESET,
00106     GZ_SOCKET_ERROR_CONNECTION_ABORTED,
00107     GZ_SOCKET_ERROR_CONNECTION_REFUSED,
00108     GZ_SOCKET_ERROR_CONNECTION_TIMEDOUT,
00109     GZ_SOCKET_ERROR_WOULD_BLOCK,
00110     GZ_SOCKET_ERROR_MESSAGE_SIZE,
00111     GZ_SOCKET_ERROR_OPERTATION_ABORTED,
00112     GZ_SOCKET_ERROR_NO_DEVICE,
00113     GZ_SOCKET_ERROR_XXX
00114 };
00115 
00116 
00117 // ------- Notification commands -----------
00118 
00119 const gzString GZ_NET_DATA  = "NetData";
00120 
00121 
00123 enum gzHostAddressType
00124 {
00125     GZ_HOST_ADDRESS_TYPE_INVALID,
00126     GZ_HOST_ADDRESS_TYPE_DOT_4,
00127 };
00128 
00129 
00131 class gzHostAddress 
00132 {
00133 public:
00134 
00135     GZ_BASE_EXPORT gzHostAddress();
00136 
00137     GZ_BASE_EXPORT gzHostAddress(gzUByte a,gzUByte b,gzUByte c,gzUByte d);
00138 
00139     GZ_BASE_EXPORT gzHostAddress(const gzString &name);
00140 
00141     GZ_BASE_EXPORT explicit gzHostAddress(gzULong address);
00142 
00143     GZ_BASE_EXPORT virtual ~gzHostAddress() { m_address.setSize(0); }
00144 
00145 
00146     GZ_BASE_EXPORT gzBool operator==(const gzHostAddress &right);
00147     GZ_BASE_EXPORT gzBool operator!=(const gzHostAddress &right) { return !operator==(right); }
00148 
00149 
00150     GZ_BASE_EXPORT gzString             asString() const;
00151 
00152     GZ_BASE_EXPORT gzHostAddressType    getHostAddressType() const;
00153 
00154     GZ_BASE_EXPORT gzLongLong           asLongLong() const;
00155 
00156     GZ_BASE_EXPORT gzULong              asULong() const;
00157 
00158     GZ_BASE_EXPORT gzBool               isValid() const;
00159 
00160 private:
00161 
00162     gzHostAddressType   m_type;
00163     gzArray<gzUByte>    m_address;
00164 };
00165 
00166 
00168 class gzHostInfo 
00169 {
00170 public:
00171 
00172     GZ_BASE_EXPORT gzHostInfo() : isValid(FALSE) {};
00173 
00174     gzString                hostName;
00175 
00176     gzArray<gzString>       hostAlias;
00177 
00178     gzArray<gzHostAddress>  hostAddress;
00179 
00180     gzBool                  isValid;
00181 };
00182 
00183 
00185 enum gzSocketAddressType
00186 {
00187     GZ_SOCKET_ADDRESS_TYPE_UNKNOWN,
00188     GZ_SOCKET_ADDRESS_TYPE_INET,
00189 };
00190 
00191 
00193 class gzSocketAddress 
00194 {
00195 public:
00196 
00197     GZ_BASE_EXPORT gzSocketAddress();
00198     GZ_BASE_EXPORT virtual ~gzSocketAddress() {};
00199 
00200     GZ_BASE_EXPORT gzSocketAddress(gzUByte *sockaddr, gzULong bytes);
00201     GZ_BASE_EXPORT gzSocketAddress(gzUShort portNumber);
00202     GZ_BASE_EXPORT gzSocketAddress(const gzHostAddress &address, gzUShort portNumber);
00203     GZ_BASE_EXPORT gzSocketAddress(const gzString &name, gzUShort portNumber);
00204 
00205     GZ_BASE_EXPORT gzBool operator==(const gzSocketAddress &right);
00206     GZ_BASE_EXPORT gzSocketAddressType getAddressType();
00207 
00208     GZ_BASE_EXPORT gzULong getLength() const;
00209     GZ_BASE_EXPORT gzUByte * getData() const;
00210 
00211 
00212     GZ_BASE_EXPORT gzHostAddress    getHostAddress();
00213     GZ_BASE_EXPORT gzUShort         getPort();
00214 
00215 protected:
00216 
00217     friend class gzSocket;
00218 
00219     gzArray<gzUByte>    m_addressData;
00220 };
00221 
00222 
00224 class gzNetData : public gzReference
00225 {
00226 public:
00227 
00228     GZ_DECLARE_TYPE_INTERFACE_EXPORT(GZ_BASE_EXPORT)
00229 
00230     gzSocketAddress     sender;
00231     gzArray<gzUByte>    data;
00232 };
00233 
00234 
00235 //******************************************************************************
00236 // Class    : gzSocket
00237 //                                  
00238 // Purpose  : Binding to tcp/udp ports
00239 //                                  
00240 // Notes    : - 
00241 //                                  
00242 // Revision History...                          
00243 //                                  
00244 // Who  Date    Description                     
00245 //                                  
00246 // AMO  010409  Created 
00247 //                                  
00248 //******************************************************************************
00250 class   gzSocket : public gzThreadTicker , public gzNotifyManager , public gzTypeInterface
00251 {
00252 public:
00253 
00254     GZ_DECLARE_TYPE_INTERFACE_EXPORT(GZ_BASE_EXPORT);
00255 
00257     GZ_BASE_EXPORT  gzSocket();
00258 
00260     GZ_BASE_EXPORT  virtual ~gzSocket();
00261 
00262 
00263     // --- Setup routines ---
00264 
00266     GZ_BASE_EXPORT  gzBool create(gzSocketFamily family , gzSocketType type=GZ_SOCKET_TYPE_STREAM);
00267     
00269     GZ_BASE_EXPORT  gzVoid close(gzBool waitForRemoteConnection=TRUE);
00270 
00272     GZ_BASE_EXPORT  gzBool setOption(gzSocketOption option, gzDynamicType value);
00273  
00275     GZ_BASE_EXPORT  gzDynamicType getOption(gzSocketOption option);
00276 
00278     GZ_BASE_EXPORT  gzBool bind(const gzSocketAddress &address=gzSocketAddress());
00279 
00280 
00281     // --- Connection management ---
00282 
00284     GZ_BASE_EXPORT  gzBool listen(gzULong maxConnections=0);
00285 
00287     GZ_BASE_EXPORT  gzSocket *accept();
00288     
00290     GZ_BASE_EXPORT  gzBool connect(const gzSocketAddress &address);
00291 
00293 
00296     GZ_BASE_EXPORT gzBool isActive();
00297 
00298 
00299     // --- Send and receive data ---
00300 
00302     GZ_BASE_EXPORT  gzInt receive(gzUByte *buffer,gzULong len);
00303     GZ_BASE_EXPORT  gzInt bufferReceive(gzUByte *buffer,gzULong len);
00304 
00306     GZ_BASE_EXPORT  gzInt receiveFrom(gzSocketAddress & address , gzUByte *buffer,gzULong len);
00307     GZ_BASE_EXPORT  gzInt bufferReceiveFrom(gzSocketAddress & address , gzUByte *buffer,gzULong len);
00308 
00309     GZ_BASE_EXPORT  gzVoid bufferPushBack(gzUByte *buffer,gzULong len);
00310 
00312     GZ_BASE_EXPORT  gzInt send(const gzUByte *buffer,gzULong len);
00313 
00315     GZ_BASE_EXPORT  gzInt sendTo(const gzSocketAddress & address ,const gzUByte *buffer,gzULong len);
00316 
00317 
00319 
00330     GZ_BASE_EXPORT gzBool isReadyToReceive(gzULong timeout = 0);
00331 
00333 
00340     GZ_BASE_EXPORT gzBool isReadyToSend(gzULong timeout = 0);
00341 
00342 
00343     // --- Error management ---
00344 
00346 
00355     GZ_BASE_EXPORT  gzSocketError getSocketError() const;
00356 
00358     GZ_BASE_EXPORT  gzBool hasSocketError() const;
00359 
00361     GZ_BASE_EXPORT  gzVoid setSocketError(gzSocketError error=GZ_SOCKET_ERROR_CHECK_FOR_ERROR);
00362 
00364     GZ_BASE_EXPORT  gzVoid clearSocketError();
00365 
00367 
00370     GZ_BASE_EXPORT  gzVoid useExceptions(gzBool on);
00371 
00372 
00373     // --- Utilities ---
00374 
00376     GZ_BASE_EXPORT  gzBool isBindTo(const gzSocketAddress &address);
00377 
00379     GZ_BASE_EXPORT  gzBool isConnectedTo(const gzSocketAddress &address);
00380 
00382     GZ_BASE_EXPORT  gzSocketAddress getBindAddress();
00383     
00385     GZ_BASE_EXPORT  gzSocketAddress getConnectAddress();
00386 
00387 
00388     // --- Ioctl based utilities ---
00389 
00391     GZ_BASE_EXPORT  gzULong getPendingBytes();
00392     GZ_BASE_EXPORT  gzULong bufferGetPendingBytes();
00393     
00395 
00398     GZ_BASE_EXPORT  gzVoid setBlocking(gzBool on = TRUE);
00399 
00401     GZ_BASE_EXPORT gzBool isBlocking() const;
00402     
00404 
00407     GZ_BASE_EXPORT  gzHostAddress   getBroadcastAddress();
00408     
00410 
00413     GZ_BASE_EXPORT  gzHostAddress   getNetworkMask();
00414 
00415 
00416     // --- Setup utilities ---
00417 
00419 
00422     GZ_BASE_EXPORT  gzBool enableMulticast(const gzHostAddress& group, gzUShort port, gzULong ttl=255);
00423     
00425 
00429     GZ_BASE_EXPORT  gzBool enableMulticast(const gzHostAddress& group, gzUShort port, const gzHostAddress& iface, gzULong ttl=255);
00430 
00432 
00433     GZ_BASE_EXPORT  gzBool enableBroadcast(gzUShort port);
00434 
00436 
00438     GZ_BASE_EXPORT  gzBool enableBroadcast(gzUShort port, const gzHostAddress& iface);
00439 
00440     GZ_BASE_EXPORT gzVoid setReceiveBufferSize(gzULong messageSize,gzULong bufferSize=0);
00441 
00442 private:
00443 
00444     virtual gzVoid onTick();
00445 
00446 
00447     gzSocketHandle          m_sockHandle;
00448 
00449     gzSocketError           m_error;
00450 
00451     gzSocketAddress         m_bind;
00452 
00453     gzSocketAddress         m_connect;
00454 
00455     gzBool                  m_useExceptions;
00456 
00457     gzBool                  m_blocking;
00458 
00459     gzSocketType            m_type;
00460 
00461     gzDynamicArray<gzUByte> m_buffer;
00462 
00463 };
00464 
00465 
00466 // ---------------- Utilites ---------------------
00467 
00468 GZ_BASE_EXPORT gzHostInfo       getHostInfo();  // Default local host
00469 GZ_BASE_EXPORT gzHostAddress    getLocalHostAddress();
00470 GZ_BASE_EXPORT gzHostInfo       getHostInfo(const gzString &hostName);
00471 GZ_BASE_EXPORT gzHostInfo       getHostInfo(const gzHostAddress &hostAddress);
00472 GZ_BASE_EXPORT gzString         getNetworkClientID();
00473 
00474 
00475 // ------------- GizmoBase implementation ---------------
00476 
00477 GZ_BASE_EXPORT gzULong          gzSwapNetworkBytesL(gzULong value);
00478 GZ_BASE_EXPORT gzUShort         gzSwapNetworkBytesS(gzUShort value);
00479 
00480 
00481 #endif // __GZ_NETWORK_H__

Documentation for Gizmo3D generated at Wed Feb 20 11:54:07 2008 by   Saab Training Systems AB, ¸ (c) 2003-and beyond