I understand you have asked about WinSock and C++ specifically, but still, there are some issues to consider:
Merely "understanding" the structure is insufficient. It is necessary to consider the following:
1) Data alignment. For example, if you have:
typedef struct
{
long int a;
short b;
long int c;
} SOME_STRUCT;
depending on compiler options, the bus width of the target CPU (e.g. 64/32/16/8 bits etc) SOME_STRUCT may end up different in size - on Windows it could be 10 or 12 bytes depending on the compiler option. This is because the compiler may leave a gap of 2 bytes after 'b' if struct members are aligned on 4-byte boundaries.
All compilers have data alignment pragmas and options. Visual studio for example, calls them "struct member alignment". So it is possible to have this different even if you use the same platform on both ends and then you could run into problems.
2) Probably not an issue unless you consider a mulitude of platforms supported by Windows CE. Then you should consider the endianness of data (as client and server may use different model). For example, client may send 4-byte integers with most significant byte first, and server may interpret them as 4-byte quantities with least significant byte first. See:
http://en.wikipedia.org/wiki/Endianness[
^]
3) If you are using exactly the same platform on both ends, and you have compiled both server and client code with the same struct alignment, then you can indeed send your struct as a stream of bytes and on the other end simply interpret the received data as the same structure.
4) It is a valid and common method to define a communications protocol using C data structs provided you have specified the alignment rules and endianness of data.