private void Send(MessageBase msg, byte[] remote) { var a = msg.ToBigEndianByteArray(); if (!scheduler.SendPacket(remote, a)) { throw new InvalidOperationException("failed to send complete message."); } }
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); } }
public bool Send(Dafny.ISequence <byte> remote, byte[] buffer) { return(scheduler.SendPacket(remote.Elements, buffer)); }
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()); } }