Again some bugs corrected, recover didn't work always.

This commit is contained in:
johns 2000-05-07 23:14:59 +00:00
parent 47bba5442a
commit 2c75bdde35

View file

@ -171,6 +171,9 @@ typedef struct _network_command_queue_ {
NetworkCommand Data; /// command content
} NetworkCommandQueue;
/// Send packets
local void NetworkSendPacket(NetworkCommandQueue* ncq);
//----------------------------------------------------------------------------
// Variables
//----------------------------------------------------------------------------
@ -1121,7 +1124,7 @@ local void NetworkServerSetup(void)
NetRecvUDP(NetworkFildes,&msg,sizeof(msg));
DebugLevel0(__FUNCTION__": receive ack %d %ld:%d\n",
msg.Type,NetLastHost,NetLastPort);
msg.Type,NetLastHost,ntohl(NetLastPort));
if( message.Type==MessageInitHello ) {
DebugLevel0(__FUNCTION__": Acknowledge lost\n");
@ -1131,13 +1134,17 @@ local void NetworkServerSetup(void)
NetSendUDP(NetworkFildes,NetLastHost,NetLastPort
,&message,sizeof(message));
} else {
DebugLevel0(__FUNCTION__": Acknowledge for config\n");
for( i=0; i<HostsCount; ++i ) {
if( NetLastHost==Hosts[i].Host
&& NetLastPort==Hosts[i].Port
&& msg.Type==MessageInitReply ) {
num[i]=-1;
j--;
if( num[i]!=-1 ) {
DebugLevel0(__FUNCTION__": Removing host\n");
num[i]=-1;
j--;
}
break;
}
}
@ -1194,6 +1201,10 @@ local void NetworkClientSetup(void)
exit(-1);
}
DebugLevel0(__FUNCTION__": receive reply\n");
if( NetLastHost==MyHost && NetLastPort==MyPort ) {
fprintf(stderr,"speaking with me self\n");
exit(-1);
}
if( NetLastHost==host && NetLastPort==port
&& message.Type==MessageInitReply ) {
break;
@ -1394,8 +1405,31 @@ global void NetworkEvent(void)
}
if( nc->Type==MessageResend ) {
DebugLevel0(__FUNCTION__": resend\n");
return;
NetworkCommandQueue* ncq;
// Destination frame (time to execute).
n=((FrameCounter+128)&~0xFF)|nc->Frame;
if( n>FrameCounter+128 ) {
n-=0x100;
}
DebugLevel0(__FUNCTION__": resend for %d\n",n);
//
// Find the commands to resend
//
ncq=(NetworkCommandQueue*)(CommandsOut->first);
while( ncq->List->next ) {
if( ncq->Time==n ) {
NetworkSendPacket(ncq);
break;
}
ncq=(NetworkCommandQueue*)(ncq->List->next);
}
if( !ncq->List->next ) {
DebugLevel0(__FUNCTION__": no packets for resend\n");
}
continue;
}
// need player number. This could also be calculated from the
@ -1427,18 +1461,15 @@ global void NetworkEvent(void)
//
if( !NetworkInSync ) {
NetworkInSync=1;
n=((FrameCounter-1)/NetworkUpdates)*NetworkUpdates+NetworkUpdates;
DebugLevel0(__FUNCTION__": wait for %d\n",n);
n=((FrameCounter)/NetworkUpdates)*NetworkUpdates+NetworkUpdates;
DebugLevel0(__FUNCTION__": wait for %d -",n);
for( player=0; player<HostsCount; ++player ) {
if( NetworkIn[n&0xFF][NetPlyNr[player]].Time!=n ) {
NetworkInSync=0;
NetworkDelay=NetworkUpdates;
// FIXME: should send a resent request, after sometime.
break;
}
}
DebugLevel0(__FUNCTION__": %d in sync %d\n",FrameCounter,NetworkInSync);
DebugLevel0("%d in sync %d\n",FrameCounter,NetworkInSync);
}
}
@ -1643,6 +1674,30 @@ local void ParseNetworkCommand(const NetworkCommandQueue* ncq)
}
}
/**
** Network send packet.
*/
local void NetworkSendPacket(NetworkCommandQueue* ncq)
{
NetworkPacket packet;
int i;
//
// Build packet of 4 messages.
//
for( i=0; i<NetworkDups; ++i ) {
packet.Commands[i]=ncq->Data;
DebugLevel3(__FUNCTION__": %p %p %d\n"
,ncq,ncq->List->next,ncq->Data.Type);
if( ncq->List->next->next ) {
ncq=(NetworkCommandQueue*)(ncq->List->next);
}
}
if( 1 || !(rand()&1) )
NetworkBroadcast(&packet,sizeof(packet));
}
/**
** Network resend commands.
*/
@ -1657,11 +1712,11 @@ local void NetworkResendCommands(void)
//
// Build packet of 4 messages.
//
//packet.Commands[0].Type=MessageResend;
//packet.Commands[0].Frame=
// (FrameCounter/NetworkUpdates)*NetworkUpdates+NetworkUpdates;
packet.Commands[0].Type=MessageResend;
packet.Commands[0].Frame=
(FrameCounter/NetworkUpdates)*NetworkUpdates+NetworkUpdates;
for( i=0; i<NetworkDups; ++i ) {
for( i=1; i<NetworkDups; ++i ) {
packet.Commands[i]=ncq->Data;
DebugLevel3(__FUNCTION__": %p %p %d %d\n"
,ncq,ncq->List->prev,ncq->Data.Type,ncq->Time);
@ -1670,7 +1725,8 @@ local void NetworkResendCommands(void)
}
}
NetworkBroadcast(&packet,sizeof(packet));
if( 1 || !(rand()&1) )
NetworkBroadcast(&packet,sizeof(packet));
}
/**
@ -1679,8 +1735,6 @@ local void NetworkResendCommands(void)
local void NetworkSendCommands(void)
{
NetworkCommandQueue* ncq;
NetworkPacket packet;
int i;
//
// No command available, send sync.
@ -1705,20 +1759,7 @@ local void NetworkSendCommands(void)
ncq->Data.Frame=ncq->Time&0xFF;
DebugLevel3(__FUNCTION__": sending for %d\n",ncq->Time);
//
// Build packet of 4 messages.
//
for( i=0; i<NetworkDups; ++i ) {
packet.Commands[i]=ncq->Data;
DebugLevel3(__FUNCTION__": %p %p %d\n"
,ncq,ncq->List->next,ncq->Data.Type);
if( ncq->List->next->next ) {
ncq=(NetworkCommandQueue*)(ncq->List->next);
}
}
NetworkBroadcast(&packet,sizeof(packet));
NetworkSendPacket(ncq);
}
/**
@ -1735,28 +1776,44 @@ local void NetworkExecCommands(void)
for( i=0; i<NumPlayers; ++i ) {
if( i==ThisPlayer->Player ) {
//
// Remove local commands from queue
// Remove outdated commands from queue
//
while( !dl_empty(CommandsOut) ) {
ncq=(NetworkCommandQueue*)(CommandsOut->last);
DebugLevel3(__FUNCTION__": Type %d Time %d\n"
,ncq->Data.Type,ncq->Time);
if( ncq->Time+NetworkLag>=FrameCounter ) {
if( ncq->Time+NetworkLag+1>=FrameCounter ) {
break;
}
DebugLevel3(__FUNCTION__": remove %d,%d\n"
,FrameCounter,ncq->Time);
dl_remove_last(CommandsOut);
ParseNetworkCommand(ncq);
free(ncq);
}
//
// Execute local commands from queue
//
ncq=(NetworkCommandQueue*)(CommandsOut->last);
while( ncq->List->prev ) {
if( ncq->Time==FrameCounter ) {
DebugLevel3(__FUNCTION__": execute loc %d,%d\n"
,FrameCounter,ncq->Time);
ParseNetworkCommand(ncq);
break;
}
ncq=(NetworkCommandQueue*)(ncq->List->prev);
}
} else {
//
// Remove external commands.
//
ncq=&NetworkIn[FrameCounter&0xFF][i];
if( ncq->Time ) {
DebugLevel3(__FUNCTION__": execute %d,%d\n"
DebugLevel3(__FUNCTION__": execute net %d,%d\n"
,FrameCounter,ncq->Time);
DebugCheck( ncq->Time!=FrameCounter );
if( ncq->Time!=FrameCounter ) {
DebugLevel0(__FUNCTION__": frame %d idx %d time %d\n"
,FrameCounter,FrameCounter&0xFF,ncq->Time);
DebugCheck( ncq->Time!=FrameCounter );
}
ParseNetworkCommand(ncq);
}
}
@ -1816,7 +1873,7 @@ global void NetworkCommands(void)
global void NetworkRecover(void)
{
// Got no message just resent our oldest messages
if( NetworkDelay==VideoInterrupts ) {
if( NetworkDelay<VideoInterrupts ) {
NetworkDelay+=NetworkUpdates;
if( !dl_empty(CommandsOut) ) {
DebugLevel0(__FUNCTION__": %d %d\n",FrameCounter,VideoInterrupts);