1 #include "TestServer.h"
3 #include "AliDCSMessage.h"
6 #include <TTimeStamp.h>
10 const Int_t TestServer::kBadState;
12 const Int_t TestServer::kTimeout;
14 const Int_t TestServer::kBadMessage;
16 const Int_t TestServer::kCommError;
18 const Int_t TestServer::kServerError;
20 TestServer::TestServer(Int_t port, Long_t timeout, Int_t retries):
21 fServerSocket(port), fTimeout(timeout), fRetries(retries)
26 Int_t TestServer::SendBuffer(TSocket* socket, const char* buffer, Int_t size) {
31 while (sentSize < size && tries < fRetries) {
33 Int_t sResult = socket->Select(TSocket::kWrite, fTimeout);
36 AliDebug(1, Form("Timeout! tries <%d> ...", tries));
40 } else if (sResult < 0) {
41 AliDebug(1, Form("Communication error <%d>!",
42 socket->GetErrorCode()));
43 return TestServer::kCommError;
46 sResult = socket->SendRaw(buffer + sentSize, size - sentSize,
52 AliDebug(1, Form("Communication error <%d>!",
53 socket->GetErrorCode()));
54 return TestServer::kCommError;
58 if (tries == fRetries) {
59 return TestServer::kTimeout;
65 Int_t TestServer::ReceiveBuffer(TSocket* socket, char* buffer, Int_t size) {
70 while (readSize < size && tries < fRetries) {
72 Int_t sResult = socket->Select(TSocket::kRead, fTimeout);
75 AliDebug(1, Form("Timeout! tries <%d> ...", tries));
79 } else if (sResult < 0) {
80 AliDebug(1, Form("Communication error <%d>!",
81 socket->GetErrorCode()));
82 return TestServer::kCommError;
85 sResult = socket->RecvRaw(buffer + readSize, size - readSize,
91 AliDebug(1, Form("Communication error <%d>!",
92 socket->GetErrorCode()));
93 return TestServer::kCommError;
97 if (tries == fRetries) {
98 return TestServer::kTimeout;
104 Int_t TestServer::SendMessage(TSocket* socket, AliDCSMessage& message) {
106 message.StoreToBuffer();
108 return SendBuffer(socket, message.GetMessage(),
109 message.GetMessageSize());
112 Int_t TestServer::ReceiveMessage(TSocket* socket, AliDCSMessage& message) {
114 char header[HEADER_SIZE];
118 if ((sResult = ReceiveBuffer(socket, header, HEADER_SIZE)) < 0) {
122 if (!message.SetRawHeader(header)) {
123 return TestServer::kBadMessage;
126 if ((sResult = ReceiveBuffer(socket, message.GetBody(),
127 message.GetBodySize())) < 0) {
132 message.LoadFromBuffer();
134 return HEADER_SIZE + sResult;
138 void TestServer::Run(Int_t count, Int_t rsSize) {
140 if (!fServerSocket.IsValid()) {
141 AliError("Invalid server socket!");
149 AliInfo("Waiting for connection");
151 connSocket = fServerSocket.Accept();
153 AliInfo("Client accepted");
156 AliError("Can't accept connection!");
160 connSocket->SetOption(kNoBlock, 1);
162 if (!connSocket->IsValid()) {
163 AliError("Invalid connection socket!");
170 AliDCSMessage message;
171 if ((result = ReceiveMessage(connSocket, message)) < 0) {
172 AliError(Form("Communication failure: ", result));
179 if (message.GetType() != AliDCSMessage::kRequest) {
180 AliError("Bad message type!");
185 AliDCSMessage countMessage;
186 countMessage.CreateCountMessage(count);
187 if ((result = SendMessage(connSocket, countMessage)) < 0) {
188 AliError(Form("Communication failure: %d", result));
193 Int_t sentValues = 0;
195 AliInfo(Form("Count: %d", count));
197 while (sentValues < count) {
199 Int_t pSize = rsSize < count - sentValues ?
200 rsSize : count - sentValues;
203 TTimeStamp currentTime;
204 AliDCSMessage rsMessage;
205 rsMessage.CreateResultSetMessage(AliSimpleValue::kInt);
207 for (Int_t k = 0; k < pSize; k ++) {
208 AliDCSValue aValue(k, currentTime.GetSec() + k);
209 rsMessage.AddValue(aValue);
212 if ((result = SendMessage(connSocket, rsMessage)) < 0) {
213 AliError(Form("Communication failure: %d",
221 AliInfo(Form("Sent values: %d", sentValues));