Exemplo n.º 1
0
        private void ProcessMessage(NetworkMessage msg)
        {
            ResetNetworkIdsMessage resetMsg = msg as ResetNetworkIdsMessage;

            if (resetMsg != null)
            {
                Array.Clear(idempotentSequenceNumbers, 0, idempotentSequenceNumbers.Length);
                if (pendingOutOfSequenceMessages.Count != 0)
                {
                    NeutrinoConfig.LogError(node.Name + " there were still pending messages when resetting id's!");
                    pendingOutOfSequenceMessages.Clear();
                }
            }
            node.OnReceived(msg);
        }
Exemplo n.º 2
0
        private void HandleMessageReceived(IAsyncResult result)
        {
            if (serverSocket != null)
            {
                try
                {
#if DEBUG
                    if (SimulatedPacketLossRate > 0.0 && (randomGenerator.NextDoublePositive() <= SimulatedPacketLossRate))
                    {
                        NeutrinoConfig.LogWarning("SIMULATING PACKET LOSS!");
                        receivedEndPoint = new IPEndPoint(IPAddress.Any, 0);
                        IAsyncResult asyncResult = serverSocket.BeginReceiveFrom(receiveBuffer, 0, NeutrinoConfig.MaxMessageSize, SocketFlags.None, ref receivedEndPoint, new AsyncCallback(HandleMessageReceived), null);
                        if (asyncResult.CompletedSynchronously)
                        {
                            HandleMessageReceived(asyncResult);
                        }
                        return;
                    }
                    else if (SimulatedPacketShuffleRate > 0.0 && (randomGenerator.NextDoublePositive() <= SimulatedPacketShuffleRate))
                    {
                        NeutrinoConfig.LogWarning("SIMULATING PACKET OUT OF ORDER!");
                        int    numReceived        = serverSocket.EndReceiveFrom(result, ref receivedEndPoint);
                        byte[] receivedForShuffle = new byte[numReceived];
                        Array.Copy(receiveBuffer, receivedForShuffle, numReceived);
                        lock (receivedBuffersForShuffling)
                        {
                            receivedBuffersForShuffling.Add(new DeferredReceivable()
                            {
                                ReceivedBuffer     = receivedForShuffle,
                                TimeToReceiveTicks = Environment.TickCount + (int)(randomGenerator.NextDoublePositive() * 100.0),
                                Endpoint           = (IPEndPoint)receivedEndPoint
                            });
                        }
                        receivedEndPoint = new IPEndPoint(IPAddress.Any, 0);
                        IAsyncResult asyncResult = serverSocket.BeginReceiveFrom(receiveBuffer, 0, NeutrinoConfig.MaxMessageSize, SocketFlags.None, ref receivedEndPoint, new AsyncCallback(HandleMessageReceived), null);
                        if (asyncResult.CompletedSynchronously)
                        {
                            HandleMessageReceived(asyncResult);
                        }
                        return;
                    }
#endif
                    int numBytesReceived = serverSocket.EndReceiveFrom(result, ref receivedEndPoint);
                    var receivedBuffer   = receivedBuffers.Pop();
                    Array.Copy(receiveBuffer, receivedBuffer.Buffer, numBytesReceived);
                    receivedBuffer.NumBytesReceived = numBytesReceived;
                    receivedBuffer.Endpoint         = (IPEndPoint)receivedEndPoint;
                    lock (readyBuffers)
                        readyBuffers.Add(receivedBuffer);
                }
                catch (Exception ex)
                {
                    NeutrinoConfig.LogError("Error handling message: " + ex);
                }

                // TBD: When tests are complete, test whether we need to reallocate here?
                receivedEndPoint = new IPEndPoint(IPAddress.Any, 0);
                IAsyncResult repeatAsyncResult = serverSocket.BeginReceiveFrom(receiveBuffer, 0, NeutrinoConfig.MaxMessageSize, SocketFlags.None, ref receivedEndPoint, new AsyncCallback(HandleMessageReceived), null);
                if (repeatAsyncResult.CompletedSynchronously)
                {
                    HandleMessageReceived(repeatAsyncResult);
                }
            }
        }