/// <summary>
        /// Initializes a new instance of the broadcast client.
        /// </summary>
        /// <param name="port">Port.</param>
        public SocketBroadcastClient(int port)
        {
            this.port = port;

            try
            {
                var address = new IPEndPoint(IPAddress.Broadcast, port);

                mainSocket = new Socket(address.AddressFamily, SocketType.Dgram, ProtocolType.Udp);

                mainSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);

                mainSocket.Connect(address);

                messageQueue = new QueueWithBlock<byte[]>();

                messagesThread = new Thread(MessagesThreadWork);

                messagesThread.IsBackground = true;

                messagesThread.Start();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.StackTrace);
            }
        }
        public static void TrySendMessage(string message)
        {
            if (messagesThread == null)
            {
                messagesThread = new Thread(MessagesThreadWork);

                messagesThread.IsBackground = true;

                messageQueue = new QueueWithBlock<string>();

                messagesThread.Start();
            }

            messageQueue.Enqueue(message);
        }
        /// <summary>
        /// Raises the client state changed event.
        /// </summary>
        /// <param name="state">Client state.</param>
        protected void OnStateChanged(SocketClientState state)
        {
            this.state = state;

            if (state == SocketClientState.Disconnected)
            {
                if (messageQueue != null)
                {
                    messageQueue.Release();

                    messageQueue = null;
                }

                messagesThread = null;
            }

            var handler = StateChanged;

            if (handler != null)
            {
                handler(this, state);
            }
        }
        /// <summary>
        /// Sends the message.
        /// </summary>
        /// <param name="message">The byte array.</param>
        public void SendMessage(byte[] message)
        {
            if (messagesThread == null)
            {
                messagesThread = new Thread(MessagesThreadWork);

                messagesThread.IsBackground = true;

                messageQueue = new QueueWithBlock<byte[]>();

                messagesThread.Start();
            }

            messageQueue.Enqueue(message);
        }
        public void Dispose()
        {
            lock (lockObject)
            {
                isDisposed = true;

                if (messageQueue != null)
                {
                    messageQueue.Release();

                    messageQueue.Clear();

                    messageQueue = null;
                }

                if (mainSocket != null)
                {
                    mainSocket.Close();

                    mainSocket.Dispose();

                    mainSocket = null;
                }

                messagesThread = null;
            }

            lockObject = null;
        }