/// <summary> /// Send the outgoing buffer to the specified remote destination. /// </summary> void EndSend(IPEndPoint ip) { mBuffer.EndPacket(); mUdp.Send(mBuffer, ip); mBuffer.Recycle(); mBuffer = null; }
/// <summary> /// Send periodic updates. /// </summary> void ThreadFunction() { mInternal = new IPEndPoint(Tools.localAddress, mGameServer.tcpPort); mExternal = new IPEndPoint(Tools.externalAddress, mGameServer.tcpPort); for (; ;) { #if !STANDALONE if (TNManager.isPaused) { Thread.Sleep(500); continue; } #endif long time = DateTime.UtcNow.Ticks / 10000; if (mShutdown) { Buffer buffer = Buffer.Create(); BinaryWriter writer = buffer.BeginPacket(Packet.RequestRemoveServer); writer.Write(GameServer.gameID); Tools.Serialize(writer, mInternal); Tools.Serialize(writer, mExternal); buffer.EndPacket(); mUdp.Send(buffer, mRemoteAddress); buffer.Recycle(); mThread = null; break; } if (mNextSend < time && mGameServer != null) { mNextSend = time + 3000; Buffer buffer = Buffer.Create(); var writer = buffer.BeginPacket(Packet.RequestAddServer); writer.Write(GameServer.gameID); writer.Write(mGameServer.name); writer.Write((short)mGameServer.playerCount); Tools.Serialize(writer, mInternal); Tools.Serialize(writer, mExternal); buffer.EndPacket(); mUdp.Send(buffer, mRemoteAddress); buffer.Recycle(); } try { Thread.Sleep(10); } catch (System.Threading.ThreadInterruptedException) { return; } } }
/// <summary> /// Send the outgoing buffer. /// </summary> public void EndSend(bool reliable) { mBuffer.EndPacket(); #if UNITY_WEBPLAYER mTcp.SendTcpPacket(mBuffer); #else if (reliable || !mUdpIsUsable || mServerUdpEndPoint == null || !mUdp.isActive) { mTcp.SendTcpPacket(mBuffer); } else { mUdp.Send(mBuffer, mServerUdpEndPoint); } #endif mBuffer.Recycle(); mBuffer = null; }
/// <summary> /// Keep receiving incoming packets. /// </summary> void Update() { Buffer buffer; IPEndPoint ip; bool changed = false; long time = System.DateTime.UtcNow.Ticks / 10000; // Receive and process UDP packets one at a time while (mUdp != null && mUdp.ReceivePacket(out buffer, out ip)) { if (buffer.size > 0) { try { BinaryReader reader = buffer.BeginReading(); Packet response = (Packet)reader.ReadByte(); if (response == Packet.ResponseServerList) { isActive = true; mNextSend = time + 3000; knownServers.ReadFrom(reader, time); knownServers.Cleanup(time); changed = true; } else if (response == Packet.Error) { errorString = reader.ReadString(); Debug.LogWarning(errorString); changed = true; } } catch (System.Exception) { } } buffer.Recycle(); } // Clean up old servers if (knownServers.Cleanup(time)) { changed = true; } // Trigger the listener callback if (changed && onChange != null) { onChange(); } else if (mNextSend < time && mUdp != null) { // Send out the update request mNextSend = time + 3000; mUdp.Send(mRequest, mRemoteAddress); } }
/// <summary> /// Send periodic updates. /// </summary> void ThreadFunction() { mInternal = new IPEndPoint(Tools.localAddress, mGameServer.tcpPort); mExternal = new IPEndPoint(Tools.externalAddress, mGameServer.tcpPort); for (; ;) { long time = DateTime.Now.Ticks / 10000; if (mShutdown) { Buffer buffer = Buffer.Create(); BinaryWriter writer = buffer.BeginPacket(Packet.RequestRemoveServer); writer.Write(GameServer.gameID); Tools.Serialize(writer, mInternal); Tools.Serialize(writer, mExternal); buffer.EndPacket(); mUdp.Send(buffer, mRemoteAddress); buffer.Recycle(); mThread = null; break; } if (mNextSend < time && mGameServer != null) { mNextSend = time + 3000; Buffer buffer = Buffer.Create(); BinaryWriter writer = buffer.BeginPacket(Packet.RequestAddServer); writer.Write(GameServer.gameID); writer.Write(mGameServer.name); writer.Write((short)mGameServer.playerCount); Tools.Serialize(writer, mInternal); Tools.Serialize(writer, mExternal); buffer.EndPacket(); mUdp.Send(buffer, mRemoteAddress); buffer.Recycle(); } Thread.Sleep(10); } }