From 378b78ebc84f233690c9e8192c0b041ae8785882 Mon Sep 17 00:00:00 2001 From: Erik Faye-Lund Date: Wed, 24 Sep 2008 15:24:30 +0000 Subject: [PATCH] Fixed bug 2040346 --- sync/device_client.cpp | 59 +++++++++++++++++++++++++------------------------- sync/network.h | 47 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 75 insertions(+), 31 deletions(-) diff --git a/sync/device_client.cpp b/sync/device_client.cpp index 6e1c8eb..2996312 100644 --- a/sync/device_client.cpp +++ b/sync/device_client.cpp @@ -20,7 +20,7 @@ public: Device(baseName), timer(timer), serverRow(-1), - serverSocket(serverSocket) + serverSocket(NetworkSocket(serverSocket)) { } @@ -31,12 +31,12 @@ public: private: void saveTracks(); - + sync::Data syncData; Timer &timer; int serverRow; - SOCKET serverSocket; + NetworkSocket serverSocket; }; ClientDevice::~ClientDevice() @@ -50,13 +50,13 @@ Track &ClientDevice::getTrack(const std::string &trackName) // send request data unsigned char cmd = GET_TRACK; - send(serverSocket, (char*)&cmd, 1, 0); + serverSocket.send((char*)&cmd, 1, 0); size_t clientIndex = syncData.getTrackCount(); - send(serverSocket, (char*)&clientIndex, sizeof(size_t), 0); + serverSocket.send((char*)&clientIndex, sizeof(size_t), 0); size_t name_len = trackName.size(); - send(serverSocket, (char*)&name_len, sizeof(size_t), 0); + serverSocket.send((char*)&name_len, sizeof(size_t), 0); const char *name_str = trackName.c_str(); - send(serverSocket, name_str, int(name_len), 0); + serverSocket.send(name_str, int(name_len), 0); // insert new track return syncData.getTrack(trackName); @@ -66,28 +66,24 @@ bool ClientDevice::update(float row) { bool done = false; // look for new commands - while (pollRead(serverSocket)) + while (serverSocket.pollRead()) { unsigned char cmd = 0; - if (0 > recv(serverSocket, (char*)&cmd, 1, 0)) - { - done = true; - break; - } - else + if (serverSocket.recv((char*)&cmd, 1, 0)) { switch (cmd) { case SET_KEY: { - int track, row; - float value; - unsigned char interp; + int track = 0, row = 0; + float value = 0.0f; + unsigned char interp = 0; - recv(serverSocket, (char*)&track, sizeof(int), 0); - recv(serverSocket, (char*)&row, sizeof(int), 0); - recv(serverSocket, (char*)&value, sizeof(float), 0); - recv(serverSocket, (char*)&interp, 1, 0); + serverSocket.recv((char*)&track, sizeof(int), 0); + serverSocket.recv((char*)&row, sizeof(int), 0); + serverSocket.recv((char*)&value, sizeof(float), 0); + serverSocket.recv((char*)&interp, 1, 0); + if (!serverSocket.connected()) return true; assert(interp < Track::KeyFrame::IT_COUNT); @@ -103,9 +99,10 @@ bool ClientDevice::update(float row) case DELETE_KEY: { - int track, row; - recv(serverSocket, (char*)&track, sizeof(int), 0); - recv(serverSocket, (char*)&row, sizeof(int), 0); + int track = 0, row = 0; + serverSocket.recv((char*)&track, sizeof(int), 0); + serverSocket.recv((char*)&row, sizeof(int), 0); + if (!serverSocket.connected()) return true; sync::Track &t = syncData.getTrack(track); t.deleteKeyFrame(row); @@ -115,7 +112,8 @@ bool ClientDevice::update(float row) case SET_ROW: { int row; - recv(serverSocket, (char*)&row, sizeof(int), 0); + serverSocket.recv((char*)&row, sizeof(int), 0); + if (!serverSocket.connected()) return true; timer.setRow(float(row)); } break; @@ -123,7 +121,8 @@ bool ClientDevice::update(float row) case PAUSE: { char flag; - recv(serverSocket, (char*)&flag, 1, 0); + serverSocket.recv((char*)&flag, 1, 0); + if (!serverSocket.connected()) return true; if (flag == 0) timer.play(); else timer.pause(); } @@ -143,16 +142,16 @@ bool ClientDevice::update(float row) if (timer.isPlaying()) { int newServerRow = int(floor(row)); - if (serverRow != newServerRow) + if (serverRow != newServerRow && serverSocket.connected()) { unsigned char cmd = SET_ROW; - send(serverSocket, (char*)&cmd, 1, 0); - send(serverSocket, (char*)&newServerRow, sizeof(int), 0); + serverSocket.send((char*)&cmd, 1, 0); + serverSocket.send((char*)&newServerRow, sizeof(int), 0); serverRow = newServerRow; } } - return !done; + return true; } static bool saveTrack(const sync::Track &track, std::string fileName) diff --git a/sync/network.h b/sync/network.h index 8cca5c9..fe0af9e 100644 --- a/sync/network.h +++ b/sync/network.h @@ -27,9 +27,54 @@ void closeNetwork(); // SOCKET clientConnect(SOCKET serverSocket); SOCKET clientConnect(SOCKET serverSocket, sockaddr_in *host = NULL); SOCKET serverConnect(struct sockaddr_in *addr); - bool pollRead(SOCKET socket); +class NetworkSocket +{ +public: + NetworkSocket(SOCKET socket = INVALID_SOCKET) : socket(socket) {} + + bool connected() const { return INVALID_SOCKET != socket; }; + void disconnect() + { + closesocket(socket); + socket = INVALID_SOCKET; + } + + bool recv(char *buffer, size_t length, int flags) + { + if (!connected()) return false; + int ret = ::recv(socket, buffer, int(length), flags); + if (ret != length) + { + disconnect(); + return false; + } + return true; + } + + bool send(const char *buffer, size_t length, int flags) + { + if (!connected()) return false; + int ret = ::send(socket, buffer, int(length), flags); + if (ret != length) + { + disconnect(); + return false; + } + return true; + } + + bool pollRead() + { + if (!connected()) return false; + return ::pollRead(socket); + } + +private: + SOCKET socket; +}; + #if 0 bool recvBlock(SOCKET socket, char *buffer, size_t length, int flags); bool sendBlock(SOCKET socket, const char *buffer, size_t length, int flags);