private static void DecodeServerAnnounce(ServerAnnounceCallback callback, IPeerDiscoveryMessage msg)
 {
     using (var ms = new MemoryStream(msg.Contents.Array, msg.Contents.Offset + 4, msg.Contents.Count - 4, false))
         using (var br = new BinaryReader(ms))
         {
             var cat          = br.ReadString();
             var con          = br.ReadString();
             var expiresDelta = br.ReadInt32();
             if (expiresDelta < 0)
             {
                 return;
             }
             var expires = DateTime.UtcNow.AddSeconds(expiresDelta);
             var cnt     = br.ReadInt32();
             if (cnt < 0 || cnt > MaxNumAttrs)
             {
                 return;
             }
             var attrs = new Dictionary <string, string>(cnt);
             for (int i = 0; i < cnt; ++i)
             {
                 var k = br.ReadString();
                 var v = br.ReadString();
                 attrs.Add(k, v);
             }
             callback(msg, cat, con, expires, attrs);
         }
 }
        // Sending

        internal void SendServerReply(IPeerDiscoveryMessage msg, string category, Guid uniqueId, string connection, int expirySeconds, IReadOnlyCollection <KeyValuePair <string, string> > attributes)
        {
            Extensions.Reply(transport_, msg, uniqueId, w =>
            {
                w.Write(Proto.ServerReply);
                _SendResourceInfo(w, category, connection, expirySeconds, attributes);
            });
        }
        public void Reply(IPeerDiscoveryMessage req, Guid streamId, ArraySegment <byte> message)
        {
            var r = req as MemoryPeerDiscoveryMessage;
            var m = new MemoryPeerDiscoveryMessage(this, streamId, message);

            r.sender_.incoming_.Enqueue(m);
            PumpMessages();
        }
 private static void DecodeClientQuery(ClientQueryCallback callback, IPeerDiscoveryMessage msg)
 {
     using (var ms = new MemoryStream(msg.Contents.Array, msg.Contents.Offset + 4, msg.Contents.Count - 4, false))
         using (var br = new BinaryReader(ms))
         {
             var category = br.ReadString();
             callback(msg, category);
         }
 }
 internal static void Reply(IPeerDiscoveryTransport net, IPeerDiscoveryMessage msg, Guid streamId, Action <BinaryWriter> cb)
 {
     byte[] buffer = new byte[1024];
     using (var str = new MemoryStream(buffer))
         using (var writer = new BinaryWriter(str))
         {
             cb.Invoke(writer);
             writer.Flush();
             net.Reply(msg, streamId, new ArraySegment <byte>(buffer, 0, (int)str.Position));
         }
 }
Example #6
0
        public void Reply(IPeerDiscoveryMessage req, Guid guid, ArraySegment <byte> message)
        {
            var umsg   = req as UdpPeerDiscoveryMessage;
            var buffer = PrependHeader(guid, message);

            if (buffer.Length > LargeMessageLimit)
            {
                Log.Warning("UdpPeerNetwork.cs: Large UDP messages will be discarded ({0} bytes)", buffer.Length);
                return;
            }
            socket_.SendTo(buffer, SocketFlags.None, umsg.sender_);
        }
        internal void Dispatch(IPeerDiscoveryMessage msg)
        {
            if (msg.Contents.Count < 4)
            {
                return; // throw
            }
            switch (BitConverter.ToInt32(msg.Contents.Array, msg.Contents.Offset))
            {
            case Proto.ServerHello:
            {
                if (OnServerHello != null)
                {
                    DecodeServerAnnounce(OnServerHello, msg);
                }
                break;
            }

            case Proto.ServerByeBye:
            {
                if (OnServerByeBye != null)
                {
                    DecodeServerByeBye(OnServerByeBye, msg);
                }
                break;
            }

            case Proto.ServerReply:
            {
                if (OnServerReply != null)
                {
                    DecodeServerAnnounce(OnServerReply, msg);
                }
                break;
            }

            case Proto.ClientQuery:
            {
                if (OnClientQuery != null)
                {
                    DecodeClientQuery(OnClientQuery, msg);
                }
                break;
            }
            }
        }
 void OnClientQuery(IPeerDiscoveryMessage msg, string category)
 {
     LocalResource[] matching;
     lock (this)
     {
         matching = (from lr in localResources_
                     where lr.Category == category
                     select lr).ToArray();
     }
     lock (announcementsLock_)
     {
         if (!stopAllAnnouncements_)
         {
             foreach (var res in matching)
             {
                 proto_.SendServerReply(msg, res.Category, res.UniqueId, res.Connection, res.ExpirySeconds, res.Attributes);
             }
         }
     }
 }
 private static void DecodeServerByeBye(ServerByeByeCallback callback, IPeerDiscoveryMessage msg)
 {
     callback(msg);
 }
        // Receiving

        private void OnMessage(IPeerDiscoveryTransport net, IPeerDiscoveryMessage msg)
        {
            Debug.Assert(net == transport_);
            Dispatch(msg);
        }