Linux / windows even different builds of Linux32bit using different compiler versions get out of sync after a while. The developers believe that the reason why this happens are floatingpoint calculations which are handled slightly different in these systems.
How can it be affected by floating point calculations if checksum is calculated using integer arithmetic only? It looks like the only system dependent thing there is using file path and files content for checksum calculating. It might produce different results because of different file path separators and line-endings and it'd be rather trivial to neglect these differences before checksum calculating, I think.
To protect users from starting games which will crash, this network consistency check checks the binary too.
And this is the reason why windows/linux is currently not possible.
Just wondering, how it is possible to visit websites hosted on various OS's from Windows or Linux and not get web-browser crash?
Actually the problem might be in network message sending/receiving code (see glest_game/network/network_message.cpp). All messages do it with
NetworkMessage::send(socket, &data, sizeof(data));
where data is instance of internal structure containing all message, well data. The problem is that sizeof(data) might produce different values for different compilers and even for same compiler, but with different settings due to member aligning (not to say it will never work for platorms with different endianess). A correct way of sending data over network (or storing it in file) is sending each field separately. E.g. for NetworkMessageIntro it'd be
NetworkMessage::send(socket, &data.messageType, sizeof(data.messageType));
NetworkMessage::send(socket, &data.versionString, sizeof(data.versionString));
NetworkMessage::send(socket, &data.name, sizeof(data.name));
NetworkMessage::send(socket, &data.playerIndex, sizeof(data.playerIndex));
NetworkMessage::send(socket, &data.resumeSaved, sizeof(data.resumeSaved));
This is not 100% correct from C++ standard point of view, since it's UB to treat pointer to non-POD data (here versionString and name) as pointer to char, but it should work on most widely used compilers/platforms, and you can add something like getBuffer method to NetworkString class to avoid possible problems here. Also, it'd be better to use htonX functions or like to convert data to particular endianess before/after sending/receiving.