00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
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
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
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
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
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
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
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
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
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
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
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
00467
00468 GZ_BASE_EXPORT gzHostInfo getHostInfo();
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
00476
00477 GZ_BASE_EXPORT gzULong gzSwapNetworkBytesL(gzULong value);
00478 GZ_BASE_EXPORT gzUShort gzSwapNetworkBytesS(gzUShort value);
00479
00480
00481 #endif // __GZ_NETWORK_H__