public static void UdpSocketRead(ref UdpClient UdpListener, ref TCommands RcvCmds, ref ByteArray RecBuf, TDecodePacketProc DecodeProc, byte XorByte, IPEndPoint _endPoint) { if (UdpListener != null && UdpListener.Available > 0) { byte[] udpTempBuf = new byte[Max_ReceiveSize]; udpTempBuf = UdpListener.Receive(ref _endPoint); int size = udpTempBuf.Length; if ((size > 0) && (size + RecBuf.Size <= RecBuf.Data.Length)) { if (XorByte > 0) { for (int i = 0; i < udpTempBuf.Length; i++) { udpTempBuf[i] = (byte)(udpTempBuf[i] ^ XorByte); } } Array.Copy(udpTempBuf, 0, RecBuf.Data, RecBuf.Index, size); RecBuf.Size += size; while (RecBuf.Size > 0) { if (DecodeProc(ref RcvCmds.Cmds[RcvCmds.CmdTail], ref RecBuf)) { RcvCmds.CmdTail++; if (RcvCmds.CmdTail == RcvCmds.CmdHead) { RcvCmds.CmdTail = 0; RcvCmds.CmdHead = 0; } if (RcvCmds.CmdTail > RcvCmds.Cmds.GetUpperBound(0)) { RcvCmds.CmdTail = 0; } if (RecBuf.Index > 0 && RecBuf.Index < RecBuf.Size) { Array.Copy(RecBuf.Data, RecBuf.Index, RecBuf.Data, 0, size - RecBuf.Index); RecBuf.Size -= RecBuf.Index; } else { RecBuf.Size = 0; } RecBuf.Index = 0; } else { return; } } } } }
public static void SocketRead(ref Socket Socket, ref TCommands RcvCmds, ref ByteArray RecBuf, TDecodePacketProc DecodeProc, byte XorByte) { if (Socket == null) { return; } if (Socket.Connected == false) { return; } if (Socket != null && Socket.Available > 0) { //野汪修正 續傳Buf不夠問題 Array.Clear(mSocketTempBuf, 0, mSocketTempBuf.Length); int count = Socket.Receive(mSocketTempBuf); int size = Math.Min(mSocketTempBuf.GetUpperBound(0) + 1, count); if ((size > 0) && (size + RecBuf.Size <= RecBuf.Data.Length)) { if (XorByte > 0) { for (int i = 0; i < mSocketTempBuf.Length; i++) { mSocketTempBuf[i] = (byte)(mSocketTempBuf[i] ^ XorByte); } } Array.Copy(mSocketTempBuf, 0, RecBuf.Data, RecBuf.Size, size); RecBuf.Size += size; while (RecBuf.Size > 0) { if (DecodeProc(ref RcvCmds.Cmds[RcvCmds.CmdTail], ref RecBuf)) { RcvCmds.CmdTail++; if (RcvCmds.CmdTail == RcvCmds.CmdHead) { RcvCmds.CmdTail = 0; RcvCmds.CmdHead = 0; } if (RcvCmds.CmdTail > RcvCmds.Cmds.GetUpperBound(0)) { RcvCmds.CmdTail = 0; } if (RecBuf.Index > 0 && RecBuf.Index < RecBuf.Size) { Array.Copy(RecBuf.Data, RecBuf.Index, RecBuf.Data, 0, RecBuf.Size - RecBuf.Index); RecBuf.Size -= RecBuf.Index; } else { RecBuf.Size = 0; } RecBuf.Index = 0; } else { return; } } } } }