I've come across this problem before and it would be good to know the different ways of solving this problem.
Synchronizing clients with a server and with each other has some tips and links.
There are a lot of ways to solve dead reckoning.
One way is to have the server store the latency of each player as well as past game states (up to the maximum time before disconnecting an inactive player). If a packet is received, the server will check the game state in the past when the player is sent the packet and check for events.