//------------------------------------------------------------------------------------------------------------------------ #endregion #region Constructor //------------------------------------------------------------------------------------------------------------------------ public LANDiscoverer(IDiscoveryMessageBase DiscoveryMessage, int DiscoveryMessageMaxSize = 1024, int BroadcastPort = DefaultBroadcastPort, int?ID = null) { DebugEx.Assert(DiscoveryMessage != null, "DiscoveryMessage cannot be null"); if (DiscoveryMessage == null) { throw new NullReferenceException("DiscoveryMessage cannot be null"); } //keep info this.BroadcastPort = BroadcastPort; this.DiscoveryMessageMaxSize = DiscoveryMessageMaxSize; //set id if (ID.HasValue) { myID = ID.Value; } //generate id while (myID == 0) #if NETFX { myID = MathTools.GetRandomNumber(0, 10000); } #elif UNIVERSAL { myID = MathTools.GetRandomNumber(20000, 100000); } #endif //update discovery message UpdateDiscoveryMessage(DiscoveryMessage); //hook event for shutdown Channel.OnSystemShutDownRequest.Add(Yodiwo.WeakAction <object> .Create(Deinitialize)); }
//------------------------------------------------------------------------------------------------------------------------ public void UpdateDiscoveryMessage(IDiscoveryMessageBase _discoveryMessage) { try { DebugEx.Assert(_discoveryMessage != null, "DiscoveryMessage cannot be null"); if (_discoveryMessage == null) { throw new NullReferenceException("DiscoveryMessage cannot be null"); } //setup id on message _discoveryMessage.Id = myID; //get size and type var _discoveryMessageType = _discoveryMessage.GetType(); //create payload var data = Tools.Marshalling.ToBytes(_discoveryMessage); if (data == null) { DebugEx.Assert("Could not get bytes from DicoveryMessage"); } else { var dataLen = data.Length; Array.Resize <byte>(ref data, data.Length + 2); for (int n = data.Length - 2; n >= 2; n--) { data[n] = data[n - 2]; } data[0] = (byte)(dataLen & 0x000000FF); data[1] = (byte)((dataLen & 0x0000FF00) >> 8); } //update this.DiscoveryMessage = _discoveryMessage; this.DiscoveryMessageType = _discoveryMessageType; this.DiscoveryMessageData = data; } catch (Exception ex) { DebugEx.Assert(ex); } }