private void OutputMessage(PeerMessage Message) { _MessageInbox.Add(Message); }
// Other Things public void RunCycle(float DeltaTime) { AssertNotDisposed(); #if !EXPOSE_ERRORS try #endif { // Connection-State Specific Operations switch (_ConnectionStatus) { case 1: // Connected // Send HeartBeats _HeartBeatSendTimer += DeltaTime; if (_HeartBeatSendTimer > NetworkConfig.HeartBeatInterval) { SendMessage("HEARTBEAT", ""); _HeartBeatSendTimer = 0; } // HeartBeat listening timer. "How long ago did I last hear you?" _HeartBeatTimeout += DeltaTime; if (_HeartBeatTimeout > NetworkConfig.HeartBeatSilenceTimeout) { _HeartBeatTimeout = 0; DropConnection(); Log_Write_System("The HeartBeat timeout was exceeded! The connection was dropped."); } break; case 2: // Connecting if (AutoSendGreeting && !_GreetingSent) { SendGreeting(); } else if (_GreetingSent & _GreetingReceived) { ChangeConnectionStatusValue(1); } _ConnectionTimeout += DeltaTime; if (_ConnectionTimeout > NetworkConfig.ConnectionTimeout) { _ConnectionTimeout = 0; DropConnection(); Log_Write_System("The connection timeout was exceeded! The connection was dropped."); } break; case 3: // Disconnecting _DisconnectTimer += DeltaTime; if (_DisconnectTimer > NetworkConfig.DisconnectWait) { _DisconnectTimer = 0; DropConnection(); Log_Write_System("Disconnected!"); } break; default: break; } // Mailing Procedure if (_Socket != null && _Socket.Connected) { // ## BEGIN Receive // Check on what was received. JsEncoder.IAbstractValue[] output = Encoding_CollectOutput(); foreach (JsEncoder.IAbstractValue item in output) { // Debug //LogSystemHumanMessage("RECEIVED: " + JsEncoder.EncoderStream.EncodeValue(item)); // Essential Information JsEncoder.TableValue outputT = (JsEncoder.TableValue)item; PeerMessage m = new PeerMessage(outputT); string mh = m.Header; if (mh == "GREETING") { if (_ConnectionStatus == 2) { bool VersionMatches = (m.Contents1S == (string)NetworkConfig.VersionString); string PeerID = m.Contents2S; _OtherPeerID = PeerID; _GreetingReceived = true; if (VersionMatches) { Log_Write_System("The other peer greeted you."); } else { Log_Write_System("The other peer sent you a greeting with an unmatching version string. Incompatibilities may occur."); } if (_GreetingSent) { ChangeConnectionStatusValue(1); } } } else if (mh == "DISCONNECTING") { if (_ConnectionStatus == 1) { BeginDisconnect(false); } break; } else if (mh == "HEARTBEAT") { _HeartBeatTimeout = 0; } else if (mh == "HUMANMESSAGE") { Log_Write(string.Format("({0}) {1}", OtherPeerDisplayName, m.Contents1S)); } OutputMessage(new PeerMessage(outputT)); } // ## END Receive // ## BEGIN Send // Debug //foreach (JsEncoder.ValueBase item in _MessageQueue) // LogSystemHumanMessage("SENT: " + JsEncoder.EncoderStream.EncodeValue(item)); // Send the pending messages // Don't send anything on 3 because we want to stop communications on that stage. if (_ConnectionStatus == 1 || _ConnectionStatus == 2) { Encoding_SendInput(_MessageOutbox.ToArray()); } _MessageOutbox.Clear(); // ## END Send } } #if !EXPOSE_ERRORS catch (Exception e) { DropConnection(); Log_Write_System(string.Concat("You lost connection due to an error. Error Message: ", e.Message)); } #endif }