00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #ifndef __UT_NetPacket__
00028 #define __UT_NetPacket__
00029
00030 #include "UT_API.h"
00031 #include <string.h>
00032
00033 class UT_NetSocket;
00034 class UT_WorkBuffer;
00035
00036 class UT_API UT_NetPacket {
00037 public:
00038 explicit UT_NetPacket(unsigned bufsize=4096);
00039 virtual ~UT_NetPacket();
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056 static UT_NetSocket *acceptClient(UT_NetSocket &server,
00057 int blocking = 1,
00058 int timeout=10);
00059
00060
00061 static const char *getUserHost();
00062
00063
00064 static int matchIPMask(const char *mask,
00065 const char *address,
00066 UT_NetSocket *socket);
00067
00068
00069 static bool matchServerClientIPs(
00070 const unsigned short server[4],
00071 const unsigned short client[4],
00072 const char *mask_pattern);
00073
00074
00075
00076
00077
00078
00079
00080 static UT_NetSocket *connectToServer(const char *host = 0,
00081 int port = -1,
00082 int blocking=1,
00083 int timeout=5,
00084 int forcesocket=0);
00085
00086 static int getDefaultServerPort();
00087
00088
00089 static void disconnectFromServer(UT_NetSocket *socket);
00090
00091 enum {
00092 PacketCompress = 0x01,
00093 PacketCrypt = 0x02
00094 };
00095
00096
00097
00098
00099
00100 int writeData(UT_NetSocket &sock, const void *data, unsigned len);
00101 int writeData(UT_NetSocket &sock, const char *data)
00102 {
00103 return writeData(sock, data, strlen(data)+1);
00104 }
00105
00106
00107 int flush(UT_NetSocket &sock);
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118 int readPacketLength(UT_NetSocket &sock, int *timeout_ms = NULL);
00119
00120
00121 int readPacketData(UT_NetSocket &sock, void *buf, unsigned len,
00122 int *timeout_ms = NULL);
00123 int readPacketData(UT_NetSocket &sock, UT_WorkBuffer &buf,
00124 unsigned int len, int *timeout_ms = NULL);
00125
00126
00127
00128 void *readPacket(UT_NetSocket &sock, unsigned &len,
00129 int timeout_ms = -1)
00130 {
00131 void *rcode = 0;
00132 len = readPacketLength(sock, &timeout_ms);
00133 if (len > 0)
00134 {
00135 growBuffer(len);
00136 if (readPacketData(sock, myData, len, &timeout_ms))
00137 rcode = myData;
00138 }
00139 return rcode;
00140 }
00141
00142
00143
00144
00145
00146 unsigned readPacket(UT_NetSocket &sock, void *data, unsigned size,
00147 int timeout_ms = -1)
00148 {
00149 unsigned len;
00150 len = readPacketLength(sock, &timeout_ms);
00151 if (len > 0 && len <= size)
00152 {
00153 if (!readPacketData(sock, data, len, &timeout_ms))
00154 len = 0;
00155 }
00156 else len = 0;
00157 return len;
00158 }
00159
00160
00161
00162
00163 unsigned readPacket(UT_NetSocket &sock, UT_WorkBuffer &wbuf,
00164 int timeout_ms = -1);
00165
00166 void setFlag(unsigned flag) { myFlag |= flag; }
00167 void clearFlag(unsigned flag) { myFlag &= ~flag; }
00168 int getFlag(unsigned flag) const { return myFlag & flag; }
00169
00170 unsigned getDataSize() const { return myDataSize; }
00171 void limitDataSize(unsigned maxsize=4096)
00172 {
00173 if (maxsize > myDataSize)
00174 growBuffer(maxsize, 1);
00175 }
00176 void *steal()
00177 {
00178 void *rcode = myData;
00179 myData = 0;
00180 myDataSize = 0;
00181 return rcode;
00182 }
00183
00184 protected:
00185
00186 void growBuffer(unsigned len, unsigned doshrink=0);
00187
00188 private:
00189 int bufferWrite(UT_NetSocket &sock, const void *data, unsigned l);
00190
00191 void *myData;
00192 char *myWriteBuf, *myWriteCurr, *myWriteEnd;
00193 unsigned myDataSize;
00194 unsigned myFlag;
00195 };
00196
00197 #endif
00198