]> git.uio.no Git - u/mrichter/AliRoot.git/blame - SHUTTLE/DCSClient/macros/TestServer.cxx
major update (Alberto)
[u/mrichter/AliRoot.git] / SHUTTLE / DCSClient / macros / TestServer.cxx
CommitLineData
73abe331 1#include "TestServer.h"
2
3#include "AliDCSMessage.h"
4#include "AliLog.h"
5
6#include <TTimeStamp.h>
7
8ClassImp(TestServer)
9
10const Int_t TestServer::kBadState;
11
12const Int_t TestServer::kTimeout;
13
14const Int_t TestServer::kBadMessage;
15
16const Int_t TestServer::kCommError;
17
18const Int_t TestServer::kServerError;
19
20TestServer::TestServer(Int_t port, Long_t timeout, Int_t retries):
21 fServerSocket(port), fTimeout(timeout), fRetries(retries)
22{
23
24}
25
26Int_t TestServer::SendBuffer(TSocket* socket, const char* buffer, Int_t size) {
27
28 Int_t sentSize = 0;
29 Int_t tries = 0;
30
31 while (sentSize < size && tries < fRetries) {
32
33 Int_t sResult = socket->Select(TSocket::kWrite, fTimeout);
34
35 if (sResult == 0) {
36 AliDebug(1, Form("Timeout! tries <%d> ...", tries));
37 tries ++;
38 continue;
39
40 } else if (sResult < 0) {
41 AliDebug(1, Form("Communication error <%d>!",
42 socket->GetErrorCode()));
43 return TestServer::kCommError;
44 }
45
46 sResult = socket->SendRaw(buffer + sentSize, size - sentSize,
47 kDontBlock);
48
49 if (sResult > 0) {
50 sentSize += sResult;
51 } else {
52 AliDebug(1, Form("Communication error <%d>!",
53 socket->GetErrorCode()));
54 return TestServer::kCommError;
55 }
56 }
57
58 if (tries == fRetries) {
59 return TestServer::kTimeout;
60 }
61
62 return sentSize;
63}
64
65Int_t TestServer::ReceiveBuffer(TSocket* socket, char* buffer, Int_t size) {
66
67 Int_t readSize = 0;
68 Int_t tries = 0;
69
70 while (readSize < size && tries < fRetries) {
71
72 Int_t sResult = socket->Select(TSocket::kRead, fTimeout);
73
74 if (sResult == 0) {
75 AliDebug(1, Form("Timeout! tries <%d> ...", tries));
76 tries ++;
77 continue;
78
79 } else if (sResult < 0) {
80 AliDebug(1, Form("Communication error <%d>!",
81 socket->GetErrorCode()));
82 return TestServer::kCommError;
83 }
84
85 sResult = socket->RecvRaw(buffer + readSize, size - readSize,
86 kDontBlock);
87
88 if (sResult > 0) {
89 readSize += sResult;
90 } else {
91 AliDebug(1, Form("Communication error <%d>!",
92 socket->GetErrorCode()));
93 return TestServer::kCommError;
94 }
95 }
96
97 if (tries == fRetries) {
98 return TestServer::kTimeout;
99 }
100
101 return readSize;
102}
103
104Int_t TestServer::SendMessage(TSocket* socket, AliDCSMessage& message) {
105
106 message.StoreToBuffer();
107
108 return SendBuffer(socket, message.GetMessage(),
109 message.GetMessageSize());
110}
111
112Int_t TestServer::ReceiveMessage(TSocket* socket, AliDCSMessage& message) {
113
114 char header[HEADER_SIZE];
115
116 Int_t sResult;
117
118 if ((sResult = ReceiveBuffer(socket, header, HEADER_SIZE)) < 0) {
119 return sResult;
120 }
121
122 if (!message.SetRawHeader(header)) {
123 return TestServer::kBadMessage;
124 }
125
126 if ((sResult = ReceiveBuffer(socket, message.GetBody(),
127 message.GetBodySize())) < 0) {
128
129 return sResult;
130 }
131
132 message.LoadFromBuffer();
133
134 return HEADER_SIZE + sResult;
135}
136
137
138void TestServer::Run(Int_t count, Int_t rsSize) {
139
140 if (!fServerSocket.IsValid()) {
141 AliError("Invalid server socket!");
142 return;
143 }
144
145
146 TSocket* connSocket;
147 while (1) {
148
149 AliInfo("Waiting for connection");
150
151 connSocket = fServerSocket.Accept();
152
153 AliInfo("Client accepted");
154
155 if (!connSocket) {
156 AliError("Can't accept connection!");
157 continue;
158 }
159
160 connSocket->SetOption(kNoBlock, 1);
161
162 if (!connSocket->IsValid()) {
163 AliError("Invalid connection socket!");
164 delete connSocket;
165 continue;
166 }
167
168 Int_t result;
169
170 AliDCSMessage message;
171 if ((result = ReceiveMessage(connSocket, message)) < 0) {
172 AliError(Form("Communication failure: ", result));
173 delete connSocket;
174 continue;
175 }
176
177 //message.Print();
178
179 if (message.GetType() != AliDCSMessage::kRequest) {
180 AliError("Bad message type!");
181 delete connSocket;
182 continue;
183 }
184
185 AliDCSMessage countMessage;
186 countMessage.CreateCountMessage(count);
187 if ((result = SendMessage(connSocket, countMessage)) < 0) {
188 AliError(Form("Communication failure: %d", result));
189 continue;
190 }
191
192
193 Int_t sentValues = 0;
194
195 AliInfo(Form("Count: %d", count));
196
197 while (sentValues < count) {
198
199 Int_t pSize = rsSize < count - sentValues ?
200 rsSize : count - sentValues;
201
202
203 TTimeStamp currentTime;
204 AliDCSMessage rsMessage;
45a493ce 205 rsMessage.CreateResultSetMessage(AliDCSValue::kInt);
73abe331 206
207 for (Int_t k = 0; k < pSize; k ++) {
208 AliDCSValue aValue(k, currentTime.GetSec() + k);
209 rsMessage.AddValue(aValue);
210 }
211
212 if ((result = SendMessage(connSocket, rsMessage)) < 0) {
213 AliError(Form("Communication failure: %d",
214 result));
215 break;
216 }
217
218 sentValues += pSize;
219 }
220
221 AliInfo(Form("Sent values: %d", sentValues));
222 delete connSocket;
223
224 //break;
225 }
226}