Exemple #1
0
        public void EncodeDecodeDiscoveryResponse()
        {
            var response = new DiscoveryResponse("tcpex://some:123/SomeService", "1.0");
            var encoded  = DiscoveryMetadataHelper.Encode(response);
            var decoded  = DiscoveryMetadataHelper.Decode(encoded);

            Assert.IsNotNull(decoded);
            Assert.AreEqual(response, decoded);
        }
Exemple #2
0
        public void EncodeDecodeDiscoveryRequest()
        {
            var request = new DiscoveryRequest("SomeService");
            var encoded = DiscoveryMetadataHelper.Encode(request);
            var decoded = DiscoveryMetadataHelper.Decode(encoded);

            Assert.IsNotNull(decoded);
            Assert.AreEqual(request, decoded);
        }
Exemple #3
0
        public void EscapeUnescapeAnotherTest()
        {
            var source  = @"\|\\d|a|\\s\s\\p|@@\fd|\pp||\\\p\p";
            var escaped = DiscoveryMetadataHelper.Escape(source);

            Assert.AreNotEqual(source, escaped);

            var unescaped = DiscoveryMetadataHelper.Unescape(escaped);

            Assert.AreEqual(source, unescaped);
        }
Exemple #4
0
        public void EscapeUnescapeTests()
        {
            var source  = @"Something\ wonderful| is h@ppening";
            var escaped = DiscoveryMetadataHelper.Escape(source);

            Assert.AreEqual(@"Something\s wonderful\p is h\appening", escaped);

            var unescaped = DiscoveryMetadataHelper.Unescape(escaped);

            Assert.AreEqual(source, unescaped);
        }
Exemple #5
0
        public void EncodeSampleDiscoveryPacket()
        {
            var dp = new SamplePacket();

            dp.Version            = "1.0";
            dp.Properties["Name"] = "Dummy";

            var packet = DiscoveryMetadataHelper.Encode(dp);

            Assert.IsNotNull(packet);
            Assert.IsTrue(packet.Length == 110);
        }
Exemple #6
0
        /// <summary>
        /// Initializes a new instance of the <see cref="DiscoveryServer"/> class.
        /// </summary>
        /// <param name="responseMetadata">The response metadata.</param>
        /// <param name="port">The port to bind to.</param>
        /// <param name="localAddress">The local address to bind to.</param>
        public DiscoveryServer(DiscoveryMetadata responseMetadata, int port = DefaultDiscoveryPort, IPAddress localAddress = null)
        {
            if (responseMetadata == null)
            {
                throw new ArgumentNullException("responseMetadata", "Discovery response metadata is missing.");
            }

            Port                   = port;
            LocalAddress           = localAddress ?? IPAddress.Any;
            ResponseMetadata       = responseMetadata;
            ResponseMetadataPacket = DiscoveryMetadataHelper.Encode(ResponseMetadata);
        }
Exemple #7
0
        public void EscapeUnescapeNulls()
        {
            var escaped = DiscoveryMetadataHelper.Escape(null);

            Assert.AreEqual("@", escaped);

            var unescaped = DiscoveryMetadataHelper.Unescape("@");

            Assert.IsNull(unescaped);

            unescaped = DiscoveryMetadataHelper.Unescape(null);
            Assert.IsNull(unescaped);
        }
Exemple #8
0
        public void DecodeSampleDiscoveryPacket()
        {
            var dp = new SamplePacket();

            dp.Version    = "EDC35F23-60AD-4730-A9AC-23D57B666DC1";
            dp.ServiceUri = @"tcp://msdn.microsoft.com/en-us/library/tst0kwb1(v=vs.110).aspx|Something=Else|#5235@#$%\a\p\|@@";
            dp.Properties["ExtraProperty"] = @"#%@$%45654!@#$\4214\|Shame=Value";
            DiscoveryMetadataHelper.RegisterDiscoveryMetadataFactory(dp.Signature, () => new SamplePacket());

            var packet  = DiscoveryMetadataHelper.Encode(dp);
            var decoded = DiscoveryMetadataHelper.Decode(packet);

            Assert.IsNotNull(decoded);
            Assert.AreEqual(decoded.GetType(), typeof(SamplePacket));
            Assert.AreEqual(dp, decoded);
        }
Exemple #9
0
        /// <summary>
        /// Initializes a new instance of the <see cref="DiscoveryClient"/> class.
        /// </summary>
        /// <param name="requestMetadata">The request metadata.</param>
        /// <param name="port">The port of the discovery server.</param>
        public DiscoveryClient(DiscoveryMetadata requestMetadata, int port = DiscoveryServer.DefaultDiscoveryPort)
        {
            if (requestMetadata == null)
            {
                throw new ArgumentNullException("requestMetadata", "Discovery request metadata is missing.");
            }

            Port                  = port;
            RequestMetadata       = requestMetadata;
            RequestMetadataPacket = DiscoveryMetadataHelper.Encode(RequestMetadata);
            DestinationAddress    = IPAddress.Broadcast;
            DestinationEndpoint   = new IPEndPoint(DestinationAddress, Port);
            Results               = new HashSet <DiscoveryMetadata>();
            RetryTimeout          = TimeSpan.FromSeconds(1);
            RetryCount            = 10;
        }
Exemple #10
0
        private void ReceiveCallback(IAsyncResult asyncResult)
        {
            var response = default(DiscoveryMetadata);

            SafePerform(() =>
            {
                var udpClient        = (UdpClient)asyncResult.AsyncState;
                var remoteEndpoint   = default(IPEndPoint);
                var responseMetadata = udpClient.EndReceive(asyncResult, ref remoteEndpoint);
                if (!Stopped)
                {
                    response = DiscoveryMetadataHelper.Decode(responseMetadata);
                }
            });

            if (response != null)
            {
                HandleResponse(response);
            }
        }
Exemple #11
0
        private void HandleRequest(UdpClient udpClient, IPEndPoint clientEndpoint, byte[] requestMetadata)
        {
            // check if request packet is damaged
            var request = DiscoveryMetadataHelper.Decode(requestMetadata);

            if (request == null)
            {
                return;
            }

            // make sure discovery metadata matches the request
            if (!ResponseMetadata.Matches(request) || Stopped)
            {
                return;
            }

            // send a response
            SafePerform(() =>
            {
                udpClient.BeginSend(ResponseMetadataPacket, ResponseMetadataPacket.Length, clientEndpoint, SendCallback, udpClient);
            });
        }