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)); } }
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); }