예제 #1
0
        private void receiveMessage(int length)
        {
            rcvdMode = receivingMode.receivingMessage;
            receivingOrder++;

            // Reallocating if needed

            if (length < 1000000)
            {

                if (length > rcvdByteBuffer.Length) rcvdByteBuffer = new byte[length];

                AsyncState asyncState = new AsyncState(receivingOrder, length);
                try
                {
                    clientSocket.BeginReceive(rcvdByteBuffer, 0, length, 0, new AsyncCallback(ReadCallback), asyncState);
                }
                catch (SocketException se)
                {
                    DebuggerIX.WriteLine(DebuggerTag.Net, role, "SocketException: " + se.Message);
                    throw;
                }
            }
            else
            {
                throw new SocketException();
            }
        }
예제 #2
0
 private void receiveDescriptor()
 {
     rcvdMode = receivingMode.receivingDescriptor;
     receivingOrder++;
     AsyncState asyncState = new AsyncState(receivingOrder, MESSAGE_DESCRIPTOR_LENGTH);
     try
     {
         clientSocket.BeginReceive(rcvdByteBuffer, 0, MESSAGE_DESCRIPTOR_LENGTH, 0,
             new AsyncCallback(ReadCallback), asyncState);
     }
     catch (SocketException e)
     {
         DebuggerIX.WriteLine(DebuggerTag.Net, role, "SocketException: " + e.Message);
         throw;
     }
 }
예제 #3
0
        protected void receivingInit()
        {
            lock (readCallbackLock)
            {
                rcvdBuffer.Clear();
            }

            rcvdMode = receivingMode.none;
            isReceiving = false;
            receivingOrder = 0;
            rcvdBufferLength = 0;
            rcvdBufferOffset = 0;
        }
예제 #4
0
        private void receiveAsyncProcessing()
        {
            isReceiving = true;

            if (rcvdMode == receivingMode.descriptorReceived)
            {
                int messageLength = BitConverter.ToInt32(rcvdByteBuffer, 0);
                rcvdNetworkMessageType = (NetworkMessageType)BitConverter.ToInt32(rcvdByteBuffer, 4);

                resetRcvdVariables();
                receiveMessage(messageLength);
            }
            else if (rcvdMode == receivingMode.messageReceived)
            {
                byte[] data = new byte[rcvdBufferLength];
                Buffer.BlockCopy(rcvdByteBuffer, 0, data, 0, rcvdBufferLength);
                rcvdBuffer.Enqueue(new Pair<NetworkMessageType, byte[]>(rcvdNetworkMessageType, data));

                receivedMessageHandle.Set();

                resetRcvdVariables();
                rcvdMode = receivingMode.none;
            }

            if (rcvdMode == receivingMode.none)
            {
                resetRcvdVariables();
                receiveDescriptor();
            }
        }
예제 #5
0
        public void ReadCallback(IAsyncResult ar)
        {
            lock (readCallbackLock)
            {

                // Retrieve the state object and the handler socket
                // from the asynchronous state object.
                AsyncState asyncState = (AsyncState)ar.AsyncState;

                // Read data from the client socket.
                int received = 0;

                try
                {
                    received = clientSocket.EndReceive(ar);
                }
                catch (ObjectDisposedException)
                {
                    DebuggerIX.WriteLine(DebuggerTag.Net, role, "ReadCallback: Socket has been closed\n");
                    return;
                }
                catch (ArgumentException e)
                {
                    DebuggerIX.WriteLine(DebuggerTag.Net, role, "ReadCallback: Called from wrong AsyncResult; Exception: " + e.Message);
                    return;
                }
                catch (SocketException se)
                {
                    if (se.ErrorCode == 10054) // Error code for Connection reset by peer
                    {
                        DebuggerIX.WriteLine(DebuggerTag.Net, role, "Client  Disconnected");
                        return;
                    }
                    else
                    {
                        DebuggerIX.WriteLine(DebuggerTag.Net, role, se.Message);
                        return;
                    }
                }

                rcvdBufferLength += received;
                rcvdBufferOffset += rcvdBufferLength;

                if (received == asyncState.Length)
                {
                    // All the data has been read from the
                    // client. Display it on the console.
                    //Console.WriteLine("Read {0} bytes from socket. \n Data : {1}", content.Length, content);

                    if (rcvdMode == receivingMode.receivingDescriptor)
                    {
                        DebuggerIX.WriteLine(DebuggerTag.Net, role,
                            "Message #" + asyncState.Order + " descriptor received. Total bytes: " + rcvdBufferLength +
                            "; Next message (length, type): (" + BitConverter.ToInt32(rcvdByteBuffer, 0) +
                            ", " + (NetworkMessageType)BitConverter.ToInt32(rcvdByteBuffer, 4) + ")");
                        rcvdMode = receivingMode.descriptorReceived;
                    }
                    else if (rcvdMode == receivingMode.receivingMessage)
                    {
                        DebuggerIX.WriteLine(DebuggerTag.Net, role,
                            "Message #" + asyncState.Order + " received. Total bytes: " + rcvdBufferLength);
                        rcvdMode = receivingMode.messageReceived;
                    }

                    receiveAsyncProcessing();
                }
                else
                {
                    asyncState.Length = asyncState.Length - received;

                    // Not all data received. Get more.
                    try
                    {
                        clientSocket.BeginReceive(rcvdByteBuffer, rcvdBufferOffset, asyncState.Length, SocketFlags.None,
                            new AsyncCallback(ReadCallback), asyncState);
                    }
                    catch (SocketException e)
                    {
                        DebuggerIX.WriteLine(DebuggerTag.Net, role, "ReadCallback: Exception. Message: " + e.Message);
                    }

                    //}
                    //catch (SocketException e)
                    //{
                    //if (isClosed == false) throw new Exception("SocketException: " + e.Message);
                    //}
                }
            }
        }