Exemplo n.º 1
0
        public async Task <Result <MessageData> > ReceiveMessageAsync()
        {
            byte[]      data  = new byte[CliServDefaults.BufferSize];
            MessageData mData = null;

            try
            {
                var recvResult = await _clientSocket.ReceiveWithTimeoutAsync(
                    data,
                    0,
                    data.Length,
                    SocketFlags.None,
                    ReceiveTypeEnum.ReceiveTypeDelay,
                    // Wait forever
                    -1
                    )
                                 .ConfigureAwait(false);

                if (recvResult.Value > 0)
                {
                    mData = ClientData <MessageData> .DeserializeFromByteArray <MessageData>(data);
                }
                return(Result.Ok(mData));
            }
            catch (SocketException e)
            {
                throw;
            }
        }
        /// <summary>
        /// The work done on the receive loop.  It assumes we are receiving MessageData types unless
        /// a MessageData received indicates a file to be received.  Then it switches over to receiving
        /// byte[].
        /// </summary>
        /// <param name="client">The client data is received from</param>
        private void ClientReceive(Client client)
        {
            if ((client == null) || (client.ClientSocket == null))
            {
                return;
            }

            ReceiveData rcvData = new ReceiveData();

            try
            {
                client.ClearData();

                var res = TcpLibExtensions.ReceiveAsync(client.ClientSocket, client.ClientData(), 0, client.DataSize, SocketFlags.None, client.CancelSource.Token);
                if (res.IsFaulted || (res.Result == null) || res.Result.Failure)
                {
                    // Just close the socket.  Look into trying to reconnect
                    Console.WriteLine("Receive Fault. Closing socket {0} to client.", client.ClientSocket.Handle);
                    ClientStore.RemoveClient((long)client.ClientSocket.Handle);
                }
                else
                {
                    System.Diagnostics.Debug.WriteLine("Receiving Data From Client: {0}", client.ClientSocket.Handle);
                    try
                    {
                        MessageData value = null;
                        if (receivingFile)
                        {
                            value              = fileMsg;
                            value.message      = client.ClientData();
                            value.length       = res.Result.Value;
                            rcvData.clientData = fileMsg;
                            totalRcv          += res.Result.Value;
                            System.Diagnostics.Debug.WriteLine("Received: Size:[{0}] - [{1}] out of [{2}]", res.Result.Value, totalRcv, fileSize);
                        }
                        else
                        {
                            value = ClientData <MessageData> .DeserializeFromByteArray <MessageData>(client.ClientData());

                            rcvData.clientData = value;
                        }
                        rcvData.clientHandle = (long)client.ClientSocket.Handle;

                        if (value != null)
                        {
                            // This indicates a response from the server to a client of which there could be many
                            if (value.response)
                            {
                                // Client received
                                OnClientDataReceived(new AsyncCompletedEventArgs(null, false, rcvData));
                            }
                            else
                            {
                                if (rcvData.clientData.id == 100)
                                {
                                    if (!receivingFile)
                                    {
                                        receivingFile    = true;
                                        fileSize         = rcvData.clientData.length;
                                        fileMsg.handle   = rcvData.clientData.handle;
                                        fileMsg.id       = rcvData.clientData.id;
                                        fileMsg.name     = rcvData.clientData.name;
                                        fileMsg.response = rcvData.clientData.response;
                                    }
                                    else if (totalRcv >= fileSize)
                                    {
                                        receivingFile = false;
                                        totalRcv      = 0;
                                        Console.WriteLine("Received all file.");
                                    }
                                }
                                // Server received
                                OnServerDataReceived(new AsyncCompletedEventArgs(null, false, rcvData));
                            }
                        }
                        else
                        {
                            // Send null message to client and server so they can detect disconnection
                            OnClientDataReceived(new AsyncCompletedEventArgs(null, false, rcvData));
                            OnServerDataReceived(new AsyncCompletedEventArgs(null, false, rcvData));
                        }
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e.Message);
                    }
                }
            }
            catch (TaskCanceledException tc)
            {
                looper.LoopDone = true;
                System.Diagnostics.Debug.WriteLine("receive Task Cancelled: " + tc.Message);
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine("Receive Exception: " + ex.Message);
            }
        }