async void SendFINMessageAsync(INetworkMessage netMsg, IPEndPoint endPoint) { UdpNetMessage udpNetMsg = netMsg as UdpNetMessage; udpNetMsg.TS = Utility.Time.MillisecondTimeStamp(); udpNetMsg.EncodeMessage(); if (udpSocket != null) { try { var buffer = udpNetMsg.GetBuffer(); int length = await udpSocket.SendAsync(buffer, buffer.Length, endPoint); if (length != buffer.Length) { //消息未完全发送,则重新发送 SendFINMessageAsync(udpNetMsg, endPoint); } } catch (Exception e) { Utility.Debug.LogError($"Send net message exceotion:{e.Message}"); } } }
public static UdpNetMessage ConvertToACK(UdpNetMessage srcMsg) { UdpNetMessage ack = CosmosEntry.ReferencePoolManager.Spawn <UdpNetMessage>(); ack.Conv = srcMsg.Conv; ack.SN = srcMsg.SN; ack.Cmd = UdpProtocol.ACK; ack.HeaderCode = srcMsg.HeaderCode; ack.RecurCount = 0; ack.EncodeMessage(); return(ack); }
public override void OnRefresh() { clientPeerRefreshHandler?.Invoke(); if (awaitHandle.Count > 0) { UdpReceiveResult data; if (awaitHandle.TryDequeue(out data)) { UdpNetMessage netMsg = CosmosEntry.ReferencePoolManager.Spawn <UdpNetMessage>(); netMsg.DecodeMessage(data.Buffer); #if DEBUG if (netMsg.Cmd == UdpProtocol.MSG) { Utility.Debug.LogInfo($" OnRefresh KCP_MSG:{netMsg} ;ServiceMessage : {Utility.Converter.GetString(netMsg.ServiceData)},TS:{netMsg.TS}"); } #endif if (netMsg.IsFull) { if (netMsg.Conv == 0) { conv += 1; netMsg.Conv = conv; UdpClientPeer peer; CreateClientPeer(netMsg, data.RemoteEndPoint, out peer); } if (peerDict.TryGetValue(netMsg.Conv, out var rPeer)) { UdpClientPeer tmpPeer = rPeer as UdpClientPeer; //如果peer失效,则移除 if (!tmpPeer.Available) { clientPeerRefreshHandler -= tmpPeer.OnRefresh; AbortUnavilablePeer(rPeer); } else { tmpPeer.MessageHandler(netMsg); } } else { //发送终结命令; UdpNetMessage finMsg = UdpNetMessage.EncodeMessage(netMsg.Conv); finMsg.Cmd = UdpProtocol.FIN; SendFINMessageAsync(finMsg, data.RemoteEndPoint); } } } } }
public override byte[] EncodingMessage(INetworkMessage message) { UdpNetMessage udpNetMsg = message as UdpNetMessage; return(udpNetMsg.EncodeMessage()); }