I've spent some time looking at this. I've never used Winsock's non-blocking WSA functions, and as it's never used in a portable apps, I can't spend a lot of time learning it. So I can't help you with all those WSAWOULDBLOCK things. I did spend some time on it, but was finding it incredibly complicated, far more than BSD Socket's select() stuff. You may find this useful.
http://tangentsoft.net/wskfaq/articles/debugging-tcp.html
The source of your problem is comms. That Calculate() function sends coordinate updates. And you have the main loop sending those Player updates. That's a real confusion, the server doesn't know what it's receiving, coordinate updates or player updates.
Further more, there's no way to indicate which player is which in the players vector. The client takes vector index zero to the local player. All the clients do that, so when there's more than one player, it all goes bad.
A player needs to be uniquely identified. So on the same machine, that might be process id. On a network, you could use hostname (or address)/pid as the identifier.
What you really need is a single message passed to the server from the clients. And a single message send back. This way, the protocol is implied and you don't need code to reconcile send/recv of different kinds of information. So this is what I recomend.
Client Protocol
1. When the client starts up, instantiates a player to represent itself. This player has a number, the pid. See GetCurrentProcessId().
2. On startup. It sends it's player info and the coordates.
3. Periodically (like when the position changes), it sends it's player info and the coordinates.
4. It listens for updates from the server. This message is the number of other players then the player/coords for each of the other players. It can then knows about all the other players and their current positions. If a player is missing from the update, you can assume it's dropped out of the game.
Server Protocol
1. The server starts up and listens for new connections (from accept) and updates (from recv).
2. The server maintains a map of SOCKET to PlayerRec (PlayerId and Coords) so it knows which client is on which socket. It also maintains a collection of these, which represent all the socket/playerid/coords sets.
3. On accept, create a new map entry and a new entry in the collection.
4. On recv, update the PlayerRec (PlayerId and Coords) for that SOCKET. The set a dirty flag.
5. On timer, if the dirty flag is set, send the number of "other" players then the details to all connected players then clear the dirty flag.