your making it too complicated

Think simple.
Each player controls only 1 model. So, all code is basically the same. The only thing your not thinking about is game updates. To start you off, do something like this ...
global NextSend
NextSend=Timer()+1000
then, somewhere about where you end your main loop ....
if NextSend<Timer()
updatethegamestatetoallusers()
NextSend=Timer()+1000
endif
checkforupdates()
sync
here's the key to your game ....
in the update function,
you transmit the location of just the users location
thats it. no matter how many players you have,
that's all you transmit.
in the checkforupdates() function ...
you see if there is data,
then you update data just for the user that sent the data.
again, thats all.
OK, now for the complicated part

What I recomment is you create a memblock (not required,
but if you use text instead, its just more work)
then in each byte of the memblock you place data ...
floats are 4 bytes .... so to send player data
x,y,z plus facing ax,ay,az ....
then on the receive data part,
you set the object based on this memblock data ...
get it ?