Example #1
0
        private void Send(MessageBase msg, byte[] remote)
        {
            var a = msg.ToBigEndianByteArray();

            if (!scheduler.SendPacket(remote, a))
            {
                throw new InvalidOperationException("failed to send complete message.");
            }
        }
Example #2
0
        private void SenderThread()
        {
            Random rng = new Random();

            while (true)
            {
                int            serverIndex     = rng.Next(serviceIdentity.Servers.Count);
                PublicIdentity serverIdentity  = serviceIdentity.Servers[serverIndex];
                byte[]         serverPublicKey = serverIdentity.PublicKey;

                int    randomNumber = rng.Next(10000);
                string message      = string.Format("Hello {0}", randomNumber);
                byte[] messageBytes = Encoding.UTF8.GetBytes(message);

                Console.WriteLine("Sending message {0} to {1}", message, IoScheduler.PublicKeyToString(serverPublicKey));

                scheduler.SendPacket(serverPublicKey, messageBytes);
                Thread.Sleep(1000);
            }
        }
Example #3
0
 public bool Send(Dafny.ISequence <byte> remote, byte[] buffer)
 {
     return(scheduler.SendPacket(remote.Elements, buffer));
 }
Example #4
0
        public byte[] SubmitRequest(byte[] request, bool verbose = false, int timeBeforeServerSwitchMs = 1000)
        {
            UInt64 seqNum = nextSeqNum++;

            byte[] requestMessage;
            using (var memStream = new MemoryStream())
            {
                IoEncoder.WriteUInt64(memStream, 0);                                 // 0 means "this is a CMessage_Request"
                IoEncoder.WriteUInt64(memStream, seqNum);                            // sequence number
                IoEncoder.WriteUInt64(memStream, (UInt64)request.Length);            // size of CAppRequest
                IoEncoder.WriteBytes(memStream, request, 0, (UInt64)request.Length); // CAppRequest
                requestMessage = memStream.ToArray();
            }

            scheduler.SendPacket(serverPublicKeys[primaryServerIndex], requestMessage);
            if (verbose)
            {
                Console.WriteLine("Sending a request with sequence number {0} to {1}",
                                  seqNum, serviceIdentity.Servers[primaryServerIndex]);
            }

            while (true)
            {
                bool   ok, timedOut;
                byte[] remote;
                byte[] replyBytes;
                scheduler.ReceivePacket(timeBeforeServerSwitchMs, out ok, out timedOut, out remote, out replyBytes);

                if (!ok)
                {
                    throw new Exception("Unrecoverable networking failure");
                }

                if (timedOut)
                {
                    primaryServerIndex = (primaryServerIndex + 1) % serviceIdentity.Servers.Count();
                    if (verbose)
                    {
                        Console.WriteLine("#timeout; rotating to server {0}", primaryServerIndex);
                    }
                    scheduler.SendPacket(serverPublicKeys[primaryServerIndex], requestMessage);
                    continue;
                }

                if (replyBytes.Length < 24)
                {
                    throw new Exception(String.Format("Got RSL reply with invalid length {0}", replyBytes.Length));
                }

                UInt64 messageType = IoEncoder.ExtractUInt64(replyBytes, 0);
                if (messageType != 6)
                {
                    throw new Exception("Got RSL message that wasn't a reply");
                }

                UInt64 replySeqNum = IoEncoder.ExtractUInt64(replyBytes, 8);
                if (replySeqNum != seqNum)
                {
                    // This is a retransmission of a reply for an old sequence
                    // number.  Ignore it.
                    continue;
                }

                UInt64 replyLength = IoEncoder.ExtractUInt64(replyBytes, 16);
                if (replyLength + 24 != (UInt64)replyBytes.Length)
                {
                    throw new Exception(String.Format("Got RSL reply with invalid encoded length ({0} instead of {1})",
                                                      replyLength, replyBytes.Length - 24));
                }

                return(replyBytes.Skip(24).ToArray());
            }
        }