private void ReceiveLoop() { bool success; if (scheduler.Verbose) { Console.WriteLine("Starting receive loop with remote identified as {0}", IoScheduler.CertificateToString(remoteCert)); } while (true) { // Read the next message's size. UInt64 messageSize; success = IoEncoder.ReadUInt64(stream, out messageSize); if (!success) { if (scheduler.Verbose) { Console.Error.WriteLine("Failed to receive message size from {0}", IoScheduler.CertificateToString(remoteCert)); } return; } if (scheduler.Verbose) { Console.WriteLine("Received message size {0} from {1}", messageSize, IoScheduler.CertificateToString(remoteCert)); } byte[] messageBuf = new byte[messageSize]; success = IoEncoder.ReadBytes(stream, messageBuf, 0, messageSize); if (!success) { if (scheduler.Verbose) { Console.Error.WriteLine("Failed to receive message of size {0} from {1}", messageSize, IoScheduler.CertificateToString(remoteCert)); } return; } if (scheduler.Verbose) { Console.WriteLine("Received message of size {0} from {1}", messageSize, IoScheduler.CertificateToString(remoteCert)); } ReceivedPacket packet = new ReceivedPacket(remoteCert, messageBuf); scheduler.NoteReceivedPacket(packet); } }
private void SendLoop() { if (scheduler.Verbose) { Console.WriteLine("Starting send loop with {0}", EndpointDescription()); } while (true) { // Wait for there to be a packet to send. currentSendTask = sendQueue.Receive(); // Send its length as an 8-byte value. UInt64 messageSize = (UInt64)currentSendTask.Message.Length; IoEncoder.WriteUInt64(stream, messageSize); if (scheduler.Verbose) { Console.WriteLine("Sent message size {0} to {1}", messageSize, EndpointDescription()); } // Send its contents. IoEncoder.WriteBytes(stream, currentSendTask.Message, 0, messageSize); if (scheduler.Verbose) { Console.WriteLine("Sent message of size {0} to {1}", messageSize, EndpointDescription()); } // Set the currentSendTask to null so we know we don't have to // resend it if the connection fails. currentSendTask = null; } }