GizmoDistribution

gzDistTransport.h

Go to the documentation of this file.
00001 //***************************************************************************
00002 // File         : gzDistTransport.h
00003 // Module       : gzRemoteDistribution
00004 // Description  : Definition of gzDistTransportInterface
00005 // Author       : Anders Sandblad       
00006 // Product      : GizmoDistribution 2.1.1
00007 //      
00008 // Copyright © 2004 - Saab Training Systems AB, Sweden
00009 //          
00010 // NOTE:    GizmoDistribution is a toolkit used for implementing distributed 
00011 //          objects and events in C++
00012 //
00013 //
00014 // Revision History...                          
00015 //                                  
00016 // Who  Date    Description                     
00017 //                                  
00018 // XAA  031113  Created file    
00019 //
00020 //***************************************************************************
00021 #ifndef __GZ_DIST_TRANSPORT_H__
00022 #define __GZ_DIST_TRANSPORT_H__
00023 
00030 // Includes
00031 #include "gzDistBase.h"
00032 
00033 
00034 // Default socket buffer size for sending an receiving
00035 #ifdef GZ_WIN32
00036 
00037     const gzULong GZ_DIST_DEFAULT_SEND_SOCKET_BUFFER = 256 * 1024 - 1;  // 256 kB
00038 
00039     const gzULong GZ_DIST_DEFAULT_RECV_SOCKET_BUFFER = 1024 * 1024 - 1; // 1 MB
00040 
00041 #else
00042 
00043     // Unix usually limit the buffer size to 65535 bytes.
00044     // System parameters will have to be changed if you need larger buffers.
00045     // On Linux that would be sysctl net.core.wmem_max and net.core.rmem_max.
00046 
00047     const gzULong GZ_DIST_DEFAULT_SEND_SOCKET_BUFFER = 64 * 1024 - 1;   // 64 kB
00048 
00049     const gzULong GZ_DIST_DEFAULT_RECV_SOCKET_BUFFER = 64 * 1024 - 1;   // 64 kB
00050 
00051 #endif
00052 
00053 
00054 //------------------------ gzDistTransportInterface -------------------------
00055 
00057 
00060 class GZ_REMOTE_EXPORT gzDistTransportInterface
00061 {
00062     public:
00063 
00065         gzDistTransportInterface() { };
00066 
00068         virtual ~gzDistTransportInterface() { };
00069 
00070 
00072         virtual gzBool open() = 0;
00073 
00075         virtual gzVoid close() = 0;
00076 
00078         virtual gzBool isOpen() const = 0; 
00079         
00081         virtual gzBool isConnected() = 0;
00082 
00083 
00085 
00087         virtual gzBool send(const gzUByte* buffer, gzULong length) = 0;
00088 
00090 
00096         virtual gzInt receive(gzUByte* buffer, gzULong length,  gzULong timeout = 0) = 0;
00097 
00098 
00099 };
00100 
00101 
00102 //--------------------------- gzDistTransportUDP ----------------------------
00103 
00105 
00112 class gzDistTransportUDP : public gzDistTransportInterface
00113 {
00114     public:
00115 
00117 
00120         GZ_REMOTE_EXPORT explicit gzDistTransportUDP(gzULong sendBuffer = GZ_DIST_DEFAULT_SEND_SOCKET_BUFFER,
00121                                                         gzULong recvBuffer = GZ_DIST_DEFAULT_RECV_SOCKET_BUFFER);
00122 
00124         GZ_REMOTE_EXPORT virtual ~gzDistTransportUDP();
00125 
00126 
00128 
00131         GZ_REMOTE_EXPORT gzBool createUnicast(const gzHostAddress& destAddress, gzUShort port, const gzHostAddress& interfaceAddress = gzHostAddress());
00132 
00134 
00136         GZ_REMOTE_EXPORT gzBool createMulticast(const gzSocketAddress& multicastAddress, const gzHostAddress& interfaceAddress = gzHostAddress());
00137         
00139 
00141         GZ_REMOTE_EXPORT gzBool createBroadcast(gzUShort port, const gzHostAddress& interfaceAddress = gzHostAddress());
00142 
00143 
00145         GZ_REMOTE_EXPORT gzBool open();
00146 
00148         GZ_REMOTE_EXPORT gzVoid close();
00149 
00151         GZ_REMOTE_EXPORT gzBool isOpen() const;
00152 
00154         GZ_REMOTE_EXPORT gzBool isConnected();
00155 
00157         GZ_REMOTE_EXPORT gzBool send(const gzUByte* buffer, gzULong length);
00158 
00160         GZ_REMOTE_EXPORT gzInt receive(gzUByte* buffer, gzULong length,  gzULong timeout = 0);
00161 
00162 
00163 
00164     private:
00165 
00166         // UDP protocol type
00167         enum gzDistProtocolType
00168         {
00169             UNDEF = 0,
00170             UNICAST,
00171             MULTICAST,
00172             BROADCAST
00173         };
00174 
00175         gzDistProtocolType m_protocolType;
00176 
00177         gzBool m_open;
00178 
00179         gzULong m_sendBufferSize;
00180         gzULong m_recvBufferSize;
00181 
00182         gzSocketAddress m_destinationAddress;
00183         gzHostAddress m_interfaceAddress;
00184 
00185         gzSocket m_sendSocket;
00186         gzSocketAddress m_sendSocketAddress;
00187 
00188         gzSocket m_receiveSocket;
00189         gzSocketAddress m_receiveSocketAddress;
00190 
00191         gzSocketAddress m_senderAddress;
00192 };
00193 
00194 
00195 //--------------------------- gzDistTransportTCP ----------------------------
00196 
00198 
00205 class gzDistTransportTCP : public gzDistTransportInterface, protected gzThread
00206 {
00207     public:
00208         
00210 
00213         GZ_REMOTE_EXPORT gzDistTransportTCP(gzULong sendBuffer = GZ_DIST_DEFAULT_SEND_SOCKET_BUFFER,
00214                                             gzULong recvBuffer = GZ_DIST_DEFAULT_RECV_SOCKET_BUFFER);
00215 
00217         GZ_REMOTE_EXPORT virtual ~gzDistTransportTCP();
00218 
00219         
00221 
00222         GZ_REMOTE_EXPORT gzBool createClient(const gzSocketAddress& remoteAddress);
00223 
00225 
00226         GZ_REMOTE_EXPORT gzBool createClient(gzSocket* connection);
00227         
00229 
00231         GZ_REMOTE_EXPORT gzBool createServer(gzUShort listenPort, const gzHostAddress& interfaceAddress = gzHostAddress(0,0,0,0));
00232 
00233 
00235         GZ_REMOTE_EXPORT gzBool open();
00236 
00238         GZ_REMOTE_EXPORT gzVoid close();
00239 
00240 
00242 
00243         GZ_REMOTE_EXPORT gzBool isOpen() const; 
00244 
00246 
00250         GZ_REMOTE_EXPORT gzBool isConnected();
00251 
00253         GZ_REMOTE_EXPORT gzBool isServer() const;
00254 
00256         GZ_REMOTE_EXPORT gzBool send(const gzUByte* buffer, gzULong length);
00257 
00259         GZ_REMOTE_EXPORT gzInt receive(gzUByte* buffer, gzULong length,  gzULong timeout = 0);
00260 
00261 
00263 
00266         GZ_REMOTE_EXPORT gzSocketAddress getClientConnectAddress();
00267 
00269 
00272         GZ_REMOTE_EXPORT gzSocketAddress getServerListenAddress();
00273 
00274 
00275     private:
00276 
00277         gzVoid process();
00278 
00279         gzVoid serverProcess();
00280 
00281         
00282         gzBool openClient();
00283 
00284         gzVoid closeClient();
00285 
00286         gzBool openServer();
00287 
00288         gzVoid closeServer(gzBool wait = TRUE);
00289 
00290 
00291     private:
00292 
00293         static const gzULong PROTOCOL_ID; // "magic" protocol identifier
00294 
00295         gzBool m_open;
00296         gzBool m_server;
00297 
00298         gzULong m_sendBufferSize;
00299         gzULong m_recvBufferSize;
00300 
00301         gzSocketAddress m_remoteAddress;
00302 
00303         gzSocket* m_clientSocket;
00304         gzSocketAddress m_clientSocketAddress;
00305 
00306         gzSocket* m_serverSocket;
00307         gzSocketAddress m_serverSocketAddress;
00308 
00309         gzArray<gzUByte> m_pendingBuffer;
00310         gzUByte* m_pendingPos;
00311         gzULong m_pendingLength;
00312 
00313 };
00314 
00315 
00316 //------------------------- gzDistTransportPipe -----------------------------
00317 
00319 
00325 class gzDistTransportPipe : public gzDistTransportInterface, protected gzThread
00326 {
00327     public:
00328 
00330 
00333         GZ_REMOTE_EXPORT gzDistTransportPipe(const gzString& name, gzBool server = FALSE, gzPipeConnection connection = GZ_PIPE_GLOBAL);
00334 
00336         GZ_REMOTE_EXPORT virtual ~gzDistTransportPipe();
00337 
00338 
00340         GZ_REMOTE_EXPORT gzBool open();
00341 
00343         GZ_REMOTE_EXPORT gzVoid close();
00344 
00346         GZ_REMOTE_EXPORT gzBool isOpen() const;
00347 
00349         GZ_REMOTE_EXPORT gzBool isConnected();
00350 
00352         GZ_REMOTE_EXPORT gzBool isServer() const;
00353 
00355         GZ_REMOTE_EXPORT gzBool send(const gzUByte* buffer, gzULong length);
00356 
00358         GZ_REMOTE_EXPORT gzInt receive(gzUByte* buffer, gzULong length,  gzULong timeout = 0);
00359 
00360 
00361     private:
00362 
00363         gzVoid process();
00364 
00365         gzVoid serverProcess();
00366 
00367 
00368     private:
00369 
00370         static const gzULong PROTOCOL_ID; // "magic" protocol identifier
00371 
00372         gzBool m_open;
00373         gzBool m_server;
00374 
00375         gzString m_name;
00376         gzPipeConnection m_connection;
00377 
00378         gzPipe* m_serverPipe;
00379         gzPipe* m_clientPipe;
00380 
00381         gzArray<gzUByte> m_pendingBuffer;
00382         gzUByte* m_pendingPos;
00383         gzULong m_pendingLength;
00384 };
00385 
00386 
00387 //-------------------------- gzDistSocketServer -----------------------------
00388 
00390 
00394 class gzDistSocketServer : public gzThread
00395 {
00396     public:
00397 
00399         GZ_REMOTE_EXPORT gzDistSocketServer();
00400 
00402         GZ_REMOTE_EXPORT virtual ~gzDistSocketServer();
00403 
00405 
00410         GZ_REMOTE_EXPORT virtual gzBool run(gzUShort port, gzULong maxConn = 0, const gzHostAddress& ifaceAddr = gzHostAddress(0,0,0,0));
00411 
00413 
00416         GZ_REMOTE_EXPORT virtual gzVoid stop(gzBool wait = TRUE);
00417     
00418 
00420 
00425         GZ_REMOTE_EXPORT virtual gzVoid onConnect(gzSocket* socket) = 0;
00426 
00427 
00428     private:
00429 
00430         GZ_REMOTE_EXPORT gzVoid process();
00431 
00432         gzVoid listen();
00433 
00434 
00435     private:
00436 
00437         gzSocket m_socket;
00438 
00439         gzULong m_maxConnections;
00440 
00441 };
00442 
00443 
00444 #endif
00445 

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