public bool Start(IPAddress bindAddress, IPAddress multicastAddress4, IPAddress multicastAddress6, uint protocolVersion, uint requiredVersion) { if (Running) { return(false); } BindAddress = bindAddress; MulticastAddress4 = multicastAddress4; MulticastAddress6 = multicastAddress6; ProtocolVersion = protocolVersion; RequiredVersion = requiredVersion; /// ToDo: Actually filter unspecified addresses like 0.0.0.0 or ::. if (bindAddress.AddressFamily == AddressFamily.InterNetwork || bindAddress.AddressFamily == AddressFamily.InterNetworkV6) { var serviceSocket = new TcpListenerSocket(); serviceSocket.Connected += OnClientConnected; serviceSocket.Disconnected += OnClientDisconnected; serviceSocket.Listen(new IPEndPoint(bindAddress, ServicePort)); _serviceSockets.Add(serviceSocket); var multicastSocket = new UdpSocket(); multicastSocket.MessageReceived += OnMulticastReceive; multicastSocket.Open(new IPEndPoint(bindAddress, MulticastPort), (bindAddress.AddressFamily == AddressFamily.InterNetworkV6) ? multicastAddress6 : multicastAddress4); _multicastSockets.Add(multicastSocket); } else { foreach (var address in NetworkHost.Instance.LocalAddresses()) { var serviceSocket = new TcpListenerSocket(); serviceSocket.Connected += OnClientConnected; serviceSocket.Disconnected += OnClientDisconnected; serviceSocket.Listen(new IPEndPoint(address, ServicePort)); _serviceSockets.Add(serviceSocket); var multicastSocket = new UdpSocket(); multicastSocket.MessageReceived += OnMulticastReceive; multicastSocket.Open(new IPEndPoint(address, MulticastPort), (bindAddress.AddressFamily == AddressFamily.InterNetworkV6) ? multicastAddress6 : multicastAddress4); _multicastSockets.Add(multicastSocket); } } Console.WriteLine(String.Format("Started ServiceHost {0:X}", HostGuid)); Running = true; return(Running); }