示例#1
0
        //---- Read Messages
        //------------------
        protected void ReceiveCallback(IAsyncResult result)
        {
            try
            {
                int byteLength = stream.EndRead(result);
                if (byteLength <= 0)
                {
                    Status = SharedEnums.ConnectionStatus.Disconnect;
                    return;
                }

                // create network packet for incoming messages
                if (packet == null)
                {
                    packet = new NetworkPacket();
                }

                byte[] data = new byte[byteLength];
                Array.Copy(readBuffer, data, byteLength);

                // read packet
                packet.AppendBytes(data);
                while (!packet.BytesNullOrEmpty)
                {
                    NetworkPacket.ProcessResult process = packet.Read();
                    if (process == NetworkPacket.ProcessResult.Error)
                    {
                        Status = SharedEnums.ConnectionStatus.Disconnect;
                        return;
                    }

                    if (process == NetworkPacket.ProcessResult.NotDone)
                    {
                        // Packet was broken up, need another packet to finish so wait to read more
                        break;
                    }
                    else if (process == NetworkPacket.ProcessResult.Done)
                    {
                        // Network message done, process
                        ProcessNetMessage(packet.Interface, packet.Type, packet.Message);
                        packet.ResetForNewMessage();

                        // will continue to read until all messages are read from bytes.
                    }
                }

                // start reading again
                stream.BeginRead(readBuffer, 0, SharedConsts.DATABUFFERSIZE, ReceiveCallback, null);
            }
            catch (Exception ex)
            {
                Log?.Error($"Error receiving message: {ex}");
                // disconnect
                Status = SharedEnums.ConnectionStatus.Disconnect;
            }
        }