// remove a node, clear all ack from this node and reset askret void Net_CloseConnection(INT32 node) { INT32 i; boolean forceclose = (node & FORCECLOSE) != 0; node &= ~FORCECLOSE; if (!node) return; nodes[node].flags |= CLOSE; // try to Send ack back (two army problem) if (GetAcktosend(node)) { Net_SendAcks(node); Net_SendAcks(node); } // check if we are waiting for an ack from this node for (i = 0; i < MAXACKPACKETS; i++) if (ackpak[i].acknum && ackpak[i].destinationnode == node) { if (!forceclose) return; // connection will be closed when ack is returned else ackpak[i].acknum = 0; } InitNode(node); AbortSendFiles(node); I_NetFreeNodenum(node); }
// // HSendPacket // boolean HSendPacket(INT32 node, boolean reliable, UINT8 acknum, size_t packetlength) { doomcom->datalength = (INT16)(packetlength + BASEPACKETSIZE); if (node == 0) // packet is to go back to us { if ((rebound_head+1) % MAXREBOUND == rebound_tail) { #ifdef PARANOIA CONS_Debug(DBG_NETPLAY, "No more rebound buf\n"); #endif return false; } M_Memcpy(&reboundstore[rebound_head], netbuffer, doomcom->datalength); reboundsize[rebound_head] = doomcom->datalength; rebound_head = (rebound_head+1) % MAXREBOUND; #ifdef DEBUGFILE if (debugfile) { doomcom->remotenode = (INT16)node; DebugPrintpacket("SENDLOCAL"); } #endif return true; } if (!netgame) I_Error("Tried to transmit to another node"); #ifdef NONET (void)node; (void)reliable; (void)acknum; #else // do this before GetFreeAcknum because this function backup // the current packet doomcom->remotenode = (INT16)node; if (doomcom->datalength <= 0) { DEBFILE("HSendPacket: nothing to send\n"); #ifdef DEBUGFILE if (debugfile) DebugPrintpacket("TRISEND"); #endif return false; } if (node < MAXNETNODES) // can be a broadcast netbuffer->ackreturn = GetAcktosend(node); else netbuffer->ackreturn = 0; if (reliable) { if (I_NetCanSend && !I_NetCanSend()) { if (netbuffer->packettype < PT_CANFAIL) GetFreeAcknum(&netbuffer->ack, true); DEBFILE("HSendPacket: Out of bandwidth\n"); return false; } else if (!GetFreeAcknum(&netbuffer->ack, false)) return false; } else netbuffer->ack = acknum; netbuffer->checksum = NetbufferChecksum(); sendbytes += packetheaderlength + doomcom->datalength; // for stat // simulate internet :) if (true || rand()<(INT32)RAND_MAX/5) { #ifdef DEBUGFILE if (debugfile) DebugPrintpacket("SEND"); #endif I_NetSend(); } #ifdef DEBUGFILE else if (debugfile) DebugPrintpacket("NOTSEND"); #endif #endif // ndef NONET return true; }