Example #1
0
        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);
            }
        }
Example #2
0
        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;
            }
        }