private void ThreadCheckSocket()
        {
            Thread.CurrentThread.Priority = ThreadPriority.Normal;
            CountStateTest = 0;
            Random RandomWait = new Random();

            IsThreadRunning = true;

            while ((_SocketClient != null) && _SocketClient.Connected)
            {
                if (SendSocketDataAvailableNotification && (_SocketClient.Available > 0))
                {
#if FIRE_EVENT_BY_BEGININVOKE
                    if (OnDataAvailable != null)
                    {
                        OnDataAvailable.BeginInvoke(this, new SocketPortDataEventArgs(new SocketPortData(SocketMessageType.SocketDataAvailable, this)), null, null);
                    }
#else
                    if (OnDataAvailable != null)
                    {
                        OnDataAvailable(this, new SocketPortDataEventArgs(new SocketPortData(SocketMessageType.SocketDataAvailable, this)));
                    }
#endif
                }
                Thread.Sleep(RandomWait.Next(10));

                if (CountStateTest > SocketBreakUpCount)
                {
                    break;
                }
            }

            if ((_SocketClient != null) && _SocketClient.Connected)
            {
                _SocketClient.Close();
            }
            _SocketClient = null;

#if FIRE_EVENT_BY_BEGININVOKE
            if (OnEventMessage != null)
            {
                OnEventMessage.BeginInvoke(this, new SocketPortMessageEventArgs(SocketMessageType.Disconnected), null, null);
            }
#else
            if (OnEventMessage != null)
            {
                OnEventMessage(this, new SocketPortMessageEventArgs(SocketMessageType.Disconnected));
            }
#endif

            IsThreadRunning = false;
        }
        public void Disconnect()
        {
            // Socket.DisconnectAsync() is new in .NET 2.0 SP1
            // not available in original .NET 2.0

            SendSocketDataAvailableNotification = false;
            if (IsConnected)
            {
                try
                {
                    DisconnectDone.Reset();
                    SocketClient.BeginDisconnect(false, new AsyncCallback(DisconnectCallBack), SocketClient);
                    DisconnectDone.WaitOne();
                    SocketClient = null;
                    //if (OnEventMessage != null) { OnEventMessage(this, new EventSocketPortMessage(SocketPortMessageType.Disconnected)); }

#if FIRE_EVENT_BY_BEGININVOKE
                    if (OnEventMessage != null)
                    {
                        OnEventMessage.BeginInvoke(this, new SocketPortMessageEventArgs(SocketMessageType.Disconnected), null, null);
                    }
#else
                    if (OnEventMessage != null)
                    {
                        OnEventMessage(this, new SocketPortMessageEventArgs(SocketMessageType.Disconnected));
                    }
#endif
                }
#if DEBUG_SOCKET
                catch (Exception e)
                {
                    AccessoryLibrary.ShowException(e);
                    DisconnectDone.Set();
                }
#else
                catch (Exception ex)
                {
                    DisconnectDone.Set();
                    logger.Error(ex.ToString() + "\n");
                }
#endif
            }
        }
        public void Connect()
        {
            IPAddress IP = null;

            IPAddress.TryParse(RemoteIpAddress, out IP);
            SendSocketDataAvailableNotification = false;

            if (IP == null)
            {
                try
                {
                    IPAddress[] IPS = Dns.GetHostAddresses(RemoteIpAddress);
                    if ((IPS != null) && (IPS.Length > 0))
                    {
                        IP = IPS[0];
                    }
                }
#if DEBUG_SOCKET
                catch (Exception e)
                {
                    AccessoryLibrary.ShowException(e);
                }
#else
                catch (Exception ex)
                {
                    logger.Error(ex.ToString() + "\n");
                }
#endif
            }

            if (IP != null)
            {
                SocketClient          = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                SocketClient.Blocking = false;
                try
                {
#if FIRE_EVENT_BY_BEGININVOKE
                    if (OnEventMessage != null)
                    {
                        OnEventMessage.BeginInvoke(this, new SocketPortMessageEventArgs(SocketMessageType.Connecting), null, null);
                    }
#else
                    if (OnEventMessage != null)
                    {
                        OnEventMessage(this, new SocketPortMessageEventArgs(SocketMessageType.Connecting));
                    }
#endif
                    SocketClient.ReceiveBufferSize = ClientSocketControl.ReceiveBufferSize;

                    ConnectDone.Reset();
                    SocketClient.BeginConnect(new IPEndPoint(IP, IpPortNumber), new AsyncCallback(ConnectCallBack), SocketClient);
                    ConnectDone.WaitOne();

                    if (IsConnected)
                    {
                        BeginSocketThread();
                        SendSocketDataAvailableNotification = true;

#if FIRE_EVENT_BY_BEGININVOKE
                        if (OnEventMessage != null)
                        {
                            OnEventMessage.BeginInvoke(this, new SocketPortMessageEventArgs(SocketMessageType.Connected), null, null);
                        }
#else
                        if (OnEventMessage != null)
                        {
                            OnEventMessage(this, new SocketPortMessageEventArgs(SocketMessageType.Connected));
                        }
#endif
                    }
                    else
                    {
                        SocketClient.Close();
                        SocketClient = null;

#if FIRE_EVENT_BY_BEGININVOKE
                        if (OnEventMessage != null)
                        {
                            OnEventMessage.BeginInvoke(this, new SocketPortMessageEventArgs(SocketMessageType.ConnectFailed), null, null);
                        }
#else
                        if (OnEventMessage != null)
                        {
                            OnEventMessage(this, new SocketPortMessageEventArgs(SocketMessageType.ConnectFailed));
                        }
#endif
                    }
                }
                catch (Exception ex)
                {
                    ConnectDone.Set();
                    SocketClient.Close();
                    SocketClient = null;
                    logger.Error(ex.ToString() + "\n");

#if FIRE_EVENT_BY_BEGININVOKE
                    if (OnEventMessage != null)
                    {
                        OnEventMessage.BeginInvoke(this, new SocketPortMessageEventArgs(SocketMessageType.ConnectFailed), null, null);
                    }
#else
                    if (OnEventMessage != null)
                    {
                        OnEventMessage(this, new SocketPortMessageEventArgs(SocketMessageType.ConnectFailed));
                    }
#endif
                }
            }
            else
            {
#if FIRE_EVENT_BY_BEGININVOKE
                if (OnEventMessage != null)
                {
                    OnEventMessage.BeginInvoke(this, new SocketPortMessageEventArgs(SocketMessageType.ConnectFailed), null, null);
                }
#else
                if (OnEventMessage != null)
                {
                    OnEventMessage(this, new SocketPortMessageEventArgs(SocketMessageType.ConnectFailed));
                }
#endif
            }
        }