Fixed bug 2040346

This commit is contained in:
Erik Faye-Lund 2008-09-24 15:24:30 +00:00
parent 1e1c636b18
commit 378b78ebc8
2 changed files with 75 additions and 31 deletions

View File

@ -20,7 +20,7 @@ public:
Device(baseName), Device(baseName),
timer(timer), timer(timer),
serverRow(-1), serverRow(-1),
serverSocket(serverSocket) serverSocket(NetworkSocket(serverSocket))
{ {
} }
@ -36,7 +36,7 @@ private:
Timer &timer; Timer &timer;
int serverRow; int serverRow;
SOCKET serverSocket; NetworkSocket serverSocket;
}; };
ClientDevice::~ClientDevice() ClientDevice::~ClientDevice()
@ -50,13 +50,13 @@ Track &ClientDevice::getTrack(const std::string &trackName)
// send request data // send request data
unsigned char cmd = GET_TRACK; unsigned char cmd = GET_TRACK;
send(serverSocket, (char*)&cmd, 1, 0); serverSocket.send((char*)&cmd, 1, 0);
size_t clientIndex = syncData.getTrackCount(); 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(); 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(); 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 // insert new track
return syncData.getTrack(trackName); return syncData.getTrack(trackName);
@ -66,28 +66,24 @@ bool ClientDevice::update(float row)
{ {
bool done = false; bool done = false;
// look for new commands // look for new commands
while (pollRead(serverSocket)) while (serverSocket.pollRead())
{ {
unsigned char cmd = 0; unsigned char cmd = 0;
if (0 > recv(serverSocket, (char*)&cmd, 1, 0)) if (serverSocket.recv((char*)&cmd, 1, 0))
{
done = true;
break;
}
else
{ {
switch (cmd) switch (cmd)
{ {
case SET_KEY: case SET_KEY:
{ {
int track, row; int track = 0, row = 0;
float value; float value = 0.0f;
unsigned char interp; unsigned char interp = 0;
recv(serverSocket, (char*)&track, sizeof(int), 0); serverSocket.recv((char*)&track, sizeof(int), 0);
recv(serverSocket, (char*)&row, sizeof(int), 0); serverSocket.recv((char*)&row, sizeof(int), 0);
recv(serverSocket, (char*)&value, sizeof(float), 0); serverSocket.recv((char*)&value, sizeof(float), 0);
recv(serverSocket, (char*)&interp, 1, 0); serverSocket.recv((char*)&interp, 1, 0);
if (!serverSocket.connected()) return true;
assert(interp < Track::KeyFrame::IT_COUNT); assert(interp < Track::KeyFrame::IT_COUNT);
@ -103,9 +99,10 @@ bool ClientDevice::update(float row)
case DELETE_KEY: case DELETE_KEY:
{ {
int track, row; int track = 0, row = 0;
recv(serverSocket, (char*)&track, sizeof(int), 0); serverSocket.recv((char*)&track, sizeof(int), 0);
recv(serverSocket, (char*)&row, sizeof(int), 0); serverSocket.recv((char*)&row, sizeof(int), 0);
if (!serverSocket.connected()) return true;
sync::Track &t = syncData.getTrack(track); sync::Track &t = syncData.getTrack(track);
t.deleteKeyFrame(row); t.deleteKeyFrame(row);
@ -115,7 +112,8 @@ bool ClientDevice::update(float row)
case SET_ROW: case SET_ROW:
{ {
int 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)); timer.setRow(float(row));
} }
break; break;
@ -123,7 +121,8 @@ bool ClientDevice::update(float row)
case PAUSE: case PAUSE:
{ {
char flag; char flag;
recv(serverSocket, (char*)&flag, 1, 0); serverSocket.recv((char*)&flag, 1, 0);
if (!serverSocket.connected()) return true;
if (flag == 0) timer.play(); if (flag == 0) timer.play();
else timer.pause(); else timer.pause();
} }
@ -143,16 +142,16 @@ bool ClientDevice::update(float row)
if (timer.isPlaying()) if (timer.isPlaying())
{ {
int newServerRow = int(floor(row)); int newServerRow = int(floor(row));
if (serverRow != newServerRow) if (serverRow != newServerRow && serverSocket.connected())
{ {
unsigned char cmd = SET_ROW; unsigned char cmd = SET_ROW;
send(serverSocket, (char*)&cmd, 1, 0); serverSocket.send((char*)&cmd, 1, 0);
send(serverSocket, (char*)&newServerRow, sizeof(int), 0); serverSocket.send((char*)&newServerRow, sizeof(int), 0);
serverRow = newServerRow; serverRow = newServerRow;
} }
} }
return !done; return true;
} }
static bool saveTrack(const sync::Track &track, std::string fileName) static bool saveTrack(const sync::Track &track, std::string fileName)

View File

@ -27,9 +27,54 @@ void closeNetwork();
// SOCKET clientConnect(SOCKET serverSocket); // SOCKET clientConnect(SOCKET serverSocket);
SOCKET clientConnect(SOCKET serverSocket, sockaddr_in *host = NULL); SOCKET clientConnect(SOCKET serverSocket, sockaddr_in *host = NULL);
SOCKET serverConnect(struct sockaddr_in *addr); SOCKET serverConnect(struct sockaddr_in *addr);
bool pollRead(SOCKET socket); 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 #if 0
bool recvBlock(SOCKET socket, char *buffer, size_t length, int flags); bool recvBlock(SOCKET socket, char *buffer, size_t length, int flags);
bool sendBlock(SOCKET socket, const char *buffer, size_t length, int flags); bool sendBlock(SOCKET socket, const char *buffer, size_t length, int flags);