diff --git a/client/controller.cpp b/client/controller.cpp index 9d3301cf..2269bfd4 100644 --- a/client/controller.cpp +++ b/client/controller.cpp @@ -1,6 +1,7 @@ #include "controller.h" #include #include +#include #include #include "oggDecoder.h" #include "pcmDecoder.h" @@ -98,19 +99,27 @@ void Controller::worker() while (active_) { - usleep(1000000); + usleep(1000000);//1000000); TimeMsg timeMsg; - BaseMessage* reply = controlConnection->sendRequest(&timeMsg, 2000); - if (reply != NULL) - { -cout << "Reply: " << reply->type << ", size: " << reply->size << ", sent: " << reply->sent.sec << "," << reply->sent.usec << ", recv: " << reply->received.sec << "," << reply->received.usec << "\n"; - if (reply->type == message_type::timemsg) + + try + { + shared_ptr reply = controlConnection->sendRequest(&timeMsg, 2000); + if (reply) { - TimeMsg* timeMsg = (TimeMsg*)(reply); - long latency = (timeMsg->received.sec - timeMsg->sent.sec) * 1000000 + (timeMsg->received.usec - timeMsg->sent.usec); - cout << "C2S: " << timeMsg->latency << ", S2C: " << latency << "\n"; + if (reply->response->type == message_type::timemsg) + { + //cout << "Reply: " << reply->response->type << ", size: " << reply->response->size << ", sent: " << reply->response->sent.sec << "," << reply->response->sent.usec << ", recv: " << reply->response->received.sec << "," << reply->response->received.usec << "\n"; + TimeMsg timeMsg; + timeMsg.deserialize(*reply->response, reply->buffer); + long latency = (timeMsg.received.sec - timeMsg.sent.sec) * 1000000 + (timeMsg.received.usec - timeMsg.sent.usec); + cout << "C2S: " << timeMsg.latency << ", S2C: " << latency << ", diff: " << (timeMsg.latency - latency) / 2 << endl; + } } } + catch (const std::exception& e) + { + } } } diff --git a/common/socketConnection.cpp b/common/socketConnection.cpp index e2d989f5..9a7a4baf 100644 --- a/common/socketConnection.cpp +++ b/common/socketConnection.cpp @@ -64,9 +64,9 @@ bool SocketConnection::send(BaseMessage* message) } -BaseMessage* SocketConnection::sendRequest(BaseMessage* message, size_t timeout) +shared_ptr SocketConnection::sendRequest(BaseMessage* message, size_t timeout) { - BaseMessage* response(NULL); + shared_ptr response(NULL); if (++reqId == 0) ++reqId; message->id = reqId; @@ -77,24 +77,26 @@ BaseMessage* SocketConnection::sendRequest(BaseMessage* message, size_t timeout) send(message); if (pendingRequest->cv.wait_for(lck,std::chrono::milliseconds(timeout)) == std::cv_status::no_timeout) { -cout << "response received\n"; - response = pendingRequest->response; + response = pendingRequest; + } + else + { + cout << "timeout while waiting for response to: " << reqId << "\n"; } pendingRequests.erase(pendingRequest); -cout << "response != NULL: " << (response != NULL) << "\n"; return response; } void SocketConnection::getNextMessage() { -cout << "getNextMessage\n"; +//cout << "getNextMessage\n"; BaseMessage baseMessage; size_t baseMsgSize = baseMessage.getSize(); vector buffer(baseMsgSize); socketRead(&buffer[0], baseMsgSize); baseMessage.deserialize(&buffer[0]); -cout << "getNextMessage: " << baseMessage.type << ", size: " << baseMessage.size << ", id: " << baseMessage.id << ", refers: " << baseMessage.refersTo << "\n"; +//cout << "getNextMessage: " << baseMessage.type << ", size: " << baseMessage.size << ", id: " << baseMessage.id << ", refers: " << baseMessage.refersTo << "\n"; if (baseMessage.size > buffer.size()) buffer.resize(baseMessage.size); socketRead(&buffer[0], baseMessage.size); @@ -105,10 +107,12 @@ cout << "getNextMessage: " << baseMessage.type << ", size: " << baseMessage.size { if (req->id == baseMessage.refersTo) { -cout << "getNextMessage response: " << baseMessage.type << ", size: " << baseMessage.size << "\n"; -long latency = (baseMessage.received.sec - baseMessage.sent.sec) * 1000000 + (baseMessage.received.usec - baseMessage.sent.usec); -cout << "latency: " << latency << "\n"; +//cout << "getNextMessage response: " << baseMessage.type << ", size: " << baseMessage.size << "\n"; +//long latency = (baseMessage.received.sec - baseMessage.sent.sec) * 1000000 + (baseMessage.received.usec - baseMessage.sent.usec); +//cout << "latency: " << latency << "\n"; req->response = new BaseMessage(baseMessage); + req->buffer = (char*)malloc(baseMessage.size); + memcpy(req->buffer, &buffer[0], baseMessage.size); req->cv.notify_one(); return; } diff --git a/common/socketConnection.h b/common/socketConnection.h index 548368ba..7f76edec 100644 --- a/common/socketConnection.h +++ b/common/socketConnection.h @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -19,10 +20,18 @@ class SocketConnection; struct PendingRequest { - PendingRequest(uint16_t reqId) : id(reqId), response(NULL) {}; + PendingRequest(uint16_t reqId) : id(reqId), response(NULL), buffer(NULL) {}; + ~PendingRequest() + { + if (response != NULL); + delete response; + if (buffer != NULL) + free(buffer); + } uint16_t id; BaseMessage* response; + char* buffer; std::condition_variable cv; }; @@ -42,7 +51,7 @@ public: virtual void start(); virtual void stop(); virtual bool send(BaseMessage* _message); - virtual BaseMessage* sendRequest(BaseMessage* message, size_t timeout); + virtual std::shared_ptr sendRequest(BaseMessage* message, size_t timeout); virtual bool active() { diff --git a/server/controlServer.cpp b/server/controlServer.cpp index 953c705d..c977d684 100644 --- a/server/controlServer.cpp +++ b/server/controlServer.cpp @@ -10,15 +10,15 @@ ControlServer::ControlServer(unsigned short port) : port_(port), headerChunk(NUL void ControlServer::onMessageReceived(SocketConnection* connection, const BaseMessage& baseMessage, char* buffer) { - cout << "onMessageReceived: " << baseMessage.type << ", size: " << baseMessage.size << ", sent: " << baseMessage.sent.sec << "," << baseMessage.sent.usec << ", recv: " << baseMessage.received.sec << "," << baseMessage.received.usec << "\n"; +// cout << "onMessageReceived: " << baseMessage.type << ", size: " << baseMessage.size << ", sent: " << baseMessage.sent.sec << "," << baseMessage.sent.usec << ", recv: " << baseMessage.received.sec << "," << baseMessage.received.usec << "\n"; if (baseMessage.type == message_type::timemsg) { - TimeMsg* timeMsg = new TimeMsg(); - timeMsg->deserialize(baseMessage, buffer); - timeMsg->latency = (timeMsg->received.sec - timeMsg->sent.sec) * 1000000 + (timeMsg->received.usec - timeMsg->sent.usec); - cout << "Latency: " << timeMsg->latency << "\n"; - timeMsg->refersTo = timeMsg->id; - connection->send(timeMsg); + TimeMsg timeMsg; + timeMsg.deserialize(baseMessage, buffer); + timeMsg.latency = (timeMsg.received.sec - timeMsg.sent.sec) * 1000000 + (timeMsg.received.usec - timeMsg.sent.usec); +// cout << "Latency: " << timeMsg.latency << "\n"; + timeMsg.refersTo = timeMsg.id; + connection->send(&timeMsg); } }