示例#1
0
        /// <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
            });
        }