Esempio n. 1
0
        /// <summary>
        /// 开启tcp服务端
        /// </summary>
        /// <returns>成功:true;失败:false</returns>
        public bool StartServer()
        {
            if (m_bRunning)
            {
                m_strLastErrorMsg = "The service is already running!";
                return(false);
            }
            //各事件初始化
            m_recvExitEvent = new ManualResetEvent(true);
            //启动监听
            try
            {
                m_tcpListener = new TcpListener(IPAddress.Any, m_nPort);
                CommunicationCommon.SetKeepAlive(m_tcpListener.Server, 10000, 5000);
                m_tcpListener.Start();
            }
            catch (System.Exception ex)
            {
                m_strLastErrorMsg = ex.Message;
                return(false);
            }
            m_bRunning = true;
            try
            {
                m_listenThread = new Thread(() => this.ListenProc());
                m_listenThread.IsBackground = true;
                m_listenThread.Start();
            }
            catch (System.Exception ex)
            {
                m_bRunning        = false;
                m_strLastErrorMsg = ex.Message;
                return(false);
            }

            return(true);
        }
Esempio n. 2
0
        /// <summary>
        /// 接收数据线程函数
        /// </summary>
        private void RecvProc(object param)
        {
            m_recvExitEvent.Reset();

            TcpClient tcpClient = param as TcpClient;

            if (OnClientChanged != null)
            {
                OnClientChanged((tcpClient.Client.RemoteEndPoint as IPEndPoint).Address.ToString(), true, m_recvClientsInfo.Count);
            }
            NetworkStream netStream = tcpClient.GetStream();

            byte[] buffer = new byte[4];//
            while (m_bRunning)
            {
                //提取包长
                int dataLen = 0;
                if (CommunicationCommon.ReadAllData(netStream, buffer, 4))
                {
                    dataLen = BitConverter.ToInt32(buffer, 0);
                    if (dataLen < 0)
                    {
                        break;//非法数据,关闭客户端
                    }
                }
                else
                {
                    break;
                }

                if (dataLen > 0)
                {
                    buffer = new byte[dataLen];
                    if (CommunicationCommon.ReadAllData(netStream, buffer, dataLen))
                    {
                        //if (OnReceiveData != null)
                        //{
                        //    OnReceiveData((IPEndPoint)tcpClient.Client.RemoteEndPoint, buffer);
                        //}
                    }
                    else
                    {
                        break;
                    }
                }
            }

            netStream.Close();
            tcpClient.Close();
            Monitor.Enter(m_recvClientsInfo);
            string     strIP = "";
            ClientInfo info  = null;

            if (m_recvClientsInfo.TryGetValue(tcpClient, out info))
            {
                strIP = info.IpAddress;
            }

            m_recvClientsInfo.Remove(tcpClient);
            if (OnClientChanged != null)
            {
                OnClientChanged(strIP, false, m_recvClientsInfo.Count);
            }

            if (m_recvClientsInfo.Count == 0)
            {
                m_recvExitEvent.Set();
            }
            Monitor.Exit(m_recvClientsInfo);
        }