/// <summary> /// 注册TCP服务信息 /// </summary> /// <param name="identity">TCP服务端标识</param> /// <param name="service">TCP服务信息</param> /// <param name="services">TCP服务信息集合</param> /// <param name="serviceName">TCP服务名称标识</param> /// <returns>注册状态</returns> private registerResult register(indexIdentity identity, service service, services services, ref hashString serviceName) { int hostCount = 0; if (services.IsSingle || service.IsSingle) { foreach (host host in services.Hosts) { indexIdentity oldClientIdentity; if (hostClients.TryGetValue(host, out oldClientIdentity)) { clientInfo oldClient = getClient(oldClientIdentity); if (oldClient != null && oldClient.OnLog != null && oldClient.OnLog(log.Check)) { services.Hosts[hostCount++] = host; } else { hostClients.Remove(host); } } } if (hostCount != 0) { if (hostCount != services.Hosts.Length) { Array.Resize(ref services.Hosts, hostCount); appendLog(new log { Type = log.type.HostChanged, Services = new services { Name = service.Name, Hosts = services.Hosts.copy() } }); } if (service.IsPerp) { getPort(identity, ref service.Host, true); if (service.Host.Port == 0) { return new registerResult { State = registerState.PortError } } ; services.SetPerpService(identity, service); return(new registerResult { State = registerState.Success, Service = service }); } return(new registerResult { State = registerState.SingleError }); } services.IsSingle = false; services.Hosts = nullValue <host> .Array; getPort(identity, ref service.Host, true); if (service.Host.Port == 0 || (service.IsCheck && hostClients.ContainsKey(service.Host))) { serviceCache.Remove(serviceName); appendLog(new log { Type = log.type.RemoveServiceName, Services = new services { Name = service.Name } }); return(new registerResult { State = service.Host.Port == 0 ? registerState.PortError : registerState.HostExists }); } hostClients[service.Host] = identity; services.Hosts = new host[] { service.Host }; services.IsSingle = service.IsSingle; appendLog(new log { Type = log.type.HostChanged, Services = new services { Name = service.Name, Hosts = new host[] { service.Host } } }); } else { getPort(identity, ref service.Host, true); if (service.Host.Port == 0) { return new registerResult { State = registerState.PortError } } ; if (service.IsCheck && hostClients.ContainsKey(service.Host)) { return new registerResult { State = registerState.HostExists } } ; hostClients[service.Host] = identity; host[] hosts = new host[services.Hosts.Length + 1]; Array.Copy(services.Hosts, 0, hosts, 1, services.Hosts.Length); hosts[0] = service.Host; services.Hosts = hosts; appendLog(new log { Type = log.type.HostChanged, Services = new services { Name = service.Name, Hosts = services.Hosts.copy() } }); } return(new registerResult { State = registerState.Success, Service = service }); }