public void Start(int port = ServiceBroadcaster.BroadcastPort) { if (_listenservicing) { return; } _listenservicing = true; _listenservice = true; Task.Run(() => { // Debug.WriteLine($"service-listener start at port{port}"); var udp = new UdpClient(port); try { IPEndPoint ipEndPoint = null; while (_listenservice) { var head = udp.Receive(ref ipEndPoint).ToStruct <ServiceInfo>(); //Debug.WriteLine($"get service_info form {ipEndPoint},length={Marshal.SizeOf(head)}"); if (!head.GetIsCorrect(Filter)) { continue; } // Debug.WriteLine($"validate service_info form {ipEndPoint}"); if (ServiceList.TryGetValue(head.ServiceUid, out ServiceDefine serviceDefine)) { serviceDefine.LastTime = DateTime.Now; } else { var define = new ServiceDefine { Guid = head.ServiceUid, LastTime = DateTime.Now, ProviderIpEndPoint = new IPEndPoint(new IPAddress(head.IpBytes), head.ServicePort) }; ServiceList.TryAdd(head.ServiceUid, define); // Debug.WriteLine( // $"new service_info add uid:{define.Guid}\r\n endpoint:{define.ProviderIpEndPoint}"); if (_bindServiceFactory != null && _bindServiceFactory.RemoteChannel == null) { _bindServiceFactory.RemoteChannel = define.ProviderIpEndPoint; } OnNewServiceAdded(define); } } //维护服务列表 foreach (var guid in ServiceList.Keys) { if ((DateTime.Now - ServiceList[guid].LastTime).TotalSeconds > 2) { if (ServiceList.TryRemove(guid, out ServiceDefine define)) { //Debug.WriteLine( //$"old service_info removed uid:{define.Guid}\r\n endpoint:{define.ProviderIpEndPoint}"); if (_bindServiceFactory != null && Equals(_bindServiceFactory.RemoteChannel, define.ProviderIpEndPoint)) { _bindServiceFactory.RemoteChannel = null; } OnServiceRemoved(define); } } } } finally { // Debug.WriteLine($"service-listener closed at {port}"); udp.Close(); _listenservicing = false; } }); }