00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef __GZ_DIST_TRANSPORT_H__
00022 #define __GZ_DIST_TRANSPORT_H__
00023
00030
00031 #include "gzDistBase.h"
00032
00033
00034
00035 #ifdef GZ_WIN32
00036
00037 const gzULong GZ_DIST_DEFAULT_SEND_SOCKET_BUFFER = 256 * 1024 - 1;
00038
00039 const gzULong GZ_DIST_DEFAULT_RECV_SOCKET_BUFFER = 1024 * 1024 - 1;
00040
00041 #else
00042
00043
00044
00045
00046
00047 const gzULong GZ_DIST_DEFAULT_SEND_SOCKET_BUFFER = 64 * 1024 - 1;
00048
00049 const gzULong GZ_DIST_DEFAULT_RECV_SOCKET_BUFFER = 64 * 1024 - 1;
00050
00051 #endif
00052
00053
00054
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
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
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
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;
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
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;
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
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