Perhaps some pseudo-code will help. My networking looks like this
Vector3 playerPos;
Vector3 enemyPos;
SOCKET GameSocket;
EVENT exitThread;
WSAEVENT networkEvent;
// main thread
int main()
{
// Initialise GameSocket. If server, use listen() / GameSocket = accept()
// If client, use connect(GameSocket)
WSAEventSelect(GameSocket, networkEvent, FD_READ | FD_WRITE)
beginthreadex(network)
while (message pump)
{
render(playerPos, enemyPos);
EnterCriticalSection(positions);
// Modify playerPos due to keyboard input etc
LeaveCriticalSection(positions);
if (escape pressed)
break;
}
SetEvent(exitThread);
WaitForSingleEvent(network thread);
}
// network thread
int network()
{
Vector3 playerPos2;
Vector3 enemyPos2;
while (true)
{
EnterCriticalSection(positions);
playerPos2 = playerPos;
LeaveCriticalSection(positions);
WSAWaitForMultipleEvents()
WSAEnumNetworkEvents()
if (network event read)
{
recv(enemyPos2);
}
if (network event write)
{
send (playerPos2);
}
EnterCriticalSection(positions);
enemyPos = enemyPos2;
LeaveCriticalSection(positions);
if (WaitForSingleEvent(exitThread, timeout = 0))
break;
}
return 0;
}