Ho ricompilato la parte server e ho fatto un po' di debug usando il telnet come client.
Ho visto che in quella if il programma entra regolarmente. Il problema sta nel thread che riceve i dati dal client collegato. C'e' questa riga

nBytes = recv(clients[c].sock, (char *)&messageSize, sizeof(messageSize), 0);

che non riesco a spiegarmi. Non ha senso e crea problemi gravi di accesso in memoria.

Al suo posto, mi sarei aspettato qualcosa del genere

nBytes = recv(clients[c].sock, buffer, MESSAGE_SIZE, 0);

Ho interrotto il debug intanto per chiarire questo punto ...