protocol: use network byte-order

The network code assumes that the client and server have the
same endianess. This isn't always the case, so let's change
it all to network byte-order.

This change is not backwards compatible, so old clients and
new editors (or vica verca) will not work together any more.
This commit is contained in:
Erik Faye-Lund 2010-08-28 16:00:56 +02:00
parent 9d4aea28fb
commit 6693c3f8f4
3 changed files with 41 additions and 15 deletions

View File

@ -573,6 +573,9 @@ void processCommand(NetworkSocket &sock)
// read data
sock.recv((char *)&clientIndex, sizeof(int), 0);
sock.recv((char *)&strLen, sizeof(int), 0);
clientIndex = ntohl(clientIndex);
strLen = ntohl(strLen);
trackName.resize(strLen);
sock.recv(&trackName[0], strLen, 0);
if (!sock.connected())
@ -599,7 +602,7 @@ void processCommand(NetworkSocket &sock)
case SET_ROW:
sock.recv((char*)&newRow, sizeof(int), 0);
trackView->setEditRow(newRow);
trackView->setEditRow(ntohl(newRow));
break;
}
}

View File

@ -85,19 +85,27 @@ public:
return index;
}
void sendSetKeyCommand(int track, const struct track_key &key)
void sendSetKeyCommand(uint32_t track, const struct track_key &key)
{
if (!clientSocket.connected()) return;
if (clientRemap.count(track) == 0) return;
track = int(clientRemap[track]);
track = htonl(clientRemap[track]);
uint32_t row = htonl(key.row);
union {
float f;
uint32_t i;
} v;
v.f = key.value;
v.i = htonl(v.i);
assert(key.type < KEY_TYPE_COUNT);
unsigned char cmd = SET_KEY;
clientSocket.send((char*)&cmd, 1, 0);
clientSocket.send((char*)&track, sizeof(int), 0);
clientSocket.send((char*)&key.row, sizeof(int), 0);
clientSocket.send((char*)&key.value, sizeof(float), 0);
clientSocket.send((char*)&track, sizeof(track), 0);
clientSocket.send((char*)&row, sizeof(row), 0);
clientSocket.send((char*)&v.i, sizeof(v.i), 0);
clientSocket.send((char*)&key.type, 1, 0);
}
@ -105,8 +113,10 @@ public:
{
if (!clientSocket.connected()) return;
if (clientRemap.count(track) == 0) return;
track = int(clientRemap[track]);
track = htonl(int(clientRemap[track]));
row = htonl(row);
unsigned char cmd = DELETE_KEY;
clientSocket.send((char*)&cmd, 1, 0);
clientSocket.send((char*)&track, sizeof(int), 0);
@ -117,8 +127,9 @@ public:
{
if (!clientSocket.connected()) return;
unsigned char cmd = SET_ROW;
row = htonl(row);
clientSocket.send((char*)&cmd, 1, 0);
clientSocket.send((char*)&row, sizeof(int), 0);
clientSocket.send((char*)&row, sizeof(int), 0);
}
void sendPauseCommand(bool pause)

View File

@ -167,28 +167,37 @@ static void save_tracks(const char *base, struct sync_data *data)
static int request_track_data(SOCKET sock, const char *name, uint32_t idx)
{
unsigned char cmd = GET_TRACK;
uint32_t name_len = strlen(name);
uint32_t name_len = htonl(strlen(name));
idx = htonl(idx);
/* send request data */
return xsend(sock, (char *)&cmd, 1, 0) ||
xsend(sock, (char *)&idx, sizeof(idx), 0) ||
xsend(sock, (char *)&name_len, sizeof(name_len), 0) ||
xsend(sock, name, (int)name_len, 0);
xsend(sock, name, (int)strlen(name), 0);
}
static int hanle_set_key_cmd(SOCKET sock, struct sync_data *data)
{
uint32_t track, row;
union {
float f;
uint32_t i;
} v;
struct track_key key;
unsigned char type;
if (xrecv(sock, (char *)&track, sizeof(track), 0) ||
xrecv(sock, (char *)&row, sizeof(row), 0) ||
xrecv(sock, (char *)&key.value, sizeof(float), 0) ||
xrecv(sock, (char *)&v.i, sizeof(v.i), 0) ||
xrecv(sock, (char *)&type, 1, 0))
return 0;
key.row = row;
track = ntohl(track);
v.i = ntohl(v.i);
key.row = ntohl(row);
key.value = v.f;
assert(type < KEY_TYPE_COUNT);
assert(track < (int)data->num_tracks);
@ -205,6 +214,9 @@ static int hanle_del_key_cmd(SOCKET sock, struct sync_data *data)
xrecv(sock, (char *)&row, sizeof(row), 0))
return 0;
track = ntohl(track);
row = ntohl(row);
assert(track < (int)data->num_tracks);
sync_del_key(data->tracks[track], row);
return 1;
@ -261,7 +273,7 @@ int sync_update(struct sync_device *d, int row)
if (xrecv(d->sock, (char *)&row, sizeof(row), 0))
goto sockerr;
if (d->cb && d->cb->set_row)
d->cb->set_row(d->cb_param, row);
d->cb->set_row(d->cb_param, ntohl(row));
break;
case PAUSE:
if (xrecv(d->sock, (char *)&flag, 1, 0))
@ -281,7 +293,7 @@ int sync_update(struct sync_device *d, int row)
if (d->cb && d->cb->is_playing && d->cb->is_playing(d->cb_param)) {
if (d->row != row && d->sock != INVALID_SOCKET) {
unsigned char cmd = SET_ROW;
uint32_t nrow = row;
uint32_t nrow = htonl(row);
if (xsend(d->sock, (char*)&cmd, 1, 0) ||
xsend(d->sock, (char*)&nrow, sizeof(nrow), 0))
goto sockerr;