コード例 #1
0
        private void _accepter()
        {
            try
            {
                m_AccepterStopEvent.Reset();

                while (Interlocked.Read(ref m_Run) == 1)
                {
                    Socket newclient = m_Listener.Accept();//.AcceptTcpClient();

                    lock (m_ClientCommunicators)
                    {
                        if (m_ClientCommunicators.Count == m_MaxClients)
                        {
                            byte[] buf = System.Text.Encoding.Default.GetBytes("Client connection exceeds. New request is closing.");

                            try
                            {
                                newclient.Send(buf);
                                newclient.Shutdown(SocketShutdown.Both);
                                newclient.Close();
                            }
                            catch (Exception ex)
                            {
                                SendLog(ex.ToString());
                            }

                            continue;
                        }
                        else
                        {
                            try
                            {
                                //IPEndPoint ep = newclient.Client.RemoteEndPoint as IPEndPoint;
                                //byte[] addr = ep.Address.GetAddressBytes();
                                //long id = addr[3] * 0x10000000000L +
                                //    addr[2] * 0x100000000L +
                                //    addr[1] * 0x1000000L +
                                //    addr[0] * 0x10000L + ep.Port;
                                long          id   = CommManager.AllocateClientID();
                                ICommunicator comm = new AsyncCommunicator(this, id, newclient, new INTERPRETER(), new EXTRACTOR(), new ENCODER(), m_bCompress);

                                lock (m_ClientCommunicators)
                                    m_ClientCommunicators[id] = comm;

                                lock (m_ClientActiveCounter)
                                    m_ClientActiveCounter[id] = 0;

                                //newclient.NoDelay = true;
                                //newclient.LingerState = new LingerOption(false, 0);
                                //newclient.SendBufferSize = 2048;
                                //newclient.SendTimeout = 1000;

                                comm.onLog += new LogHandler(comm_onLog);
                                comm.onConnectionBroken += new ConnectionBrokenHandler(_HandleConnectionBroken);
                                comm.startWork();

                                // 发送报文注册客户端
                                MSGTYPE msg = new MSGTYPE();
                                msg.SeqID          = CommandProcessor.AllocateID();
                                msg.TK_CommandType = Constants.TK_CommandType.REGISTERCLIENT;
                                msg.SetValue("ClientID", id);
                                msg.SetValue("SERVERNAME", Name);
                                msg.SetValue(Constants.MSG_PARANAME_AUTHORIZED, false);
                                CommandProcessor.instance().DispatchCommand(msg);

                                SendLog("客户端 " + newclient.RemoteEndPoint.ToString() + " 连接到:" + Name);

                                SendLog(Name + "当前客户端的数量:" + m_ClientCommunicators.Count);

                                //int wt, iot;
                                //ThreadPool.GetAvailableThreads(out wt, out iot);
                                //SendLog("可用工作线程数: " + wt + " I/O线程数: " + iot);
                            }
                            catch (Exception ex)
                            {
                                try
                                {
                                    //NetworkStream ns = newclient.GetStream();
                                    //if (ns != null)
                                    //    ns.Close();

                                    newclient.Close();
                                    SendLog(ex.ToString());
                                }
                                catch { }
                            }
                        }
                    } // endlock
                }
            }
            catch (Exception ex)
            {
                SendLog(ex.ToString());
            }
            finally
            {
                m_AccepterStopEvent.Set();
            }
        }
コード例 #2
0
        private void _accepterCallback(IAsyncResult ar)
        {
            Socket newclient = m_Listener.EndAccept(ar);

            lock (m_ClientCommunicators)
            {
                if (m_ClientCommunicators.Count == m_MaxClients)
                {
                    byte[] buf = System.Text.Encoding.Default.GetBytes("Client connection exceeds. New request is closing.");

                    try
                    {
                        newclient.Send(buf);
                        newclient.Shutdown(SocketShutdown.Both);
                        newclient.Close();
                    }
                    catch (Exception ex)
                    {
                        SendLog(ex.ToString());
                    }
                }
                else
                {
                    try
                    {
                        long          id   = CommManager.AllocateClientID();
                        ICommunicator comm = new AsyncCommunicator(this, id, newclient, new INTERPRETER(), new EXTRACTOR(), new ENCODER(), m_bCompress);

                        lock (m_ClientCommunicators)
                            m_ClientCommunicators[id] = comm;

                        lock (m_ClientActiveCounter)
                            m_ClientActiveCounter[id] = 0;

                        comm.onLog += new LogHandler(comm_onLog);
                        comm.onConnectionBroken += new ConnectionBrokenHandler(_HandleConnectionBroken);
                        comm.startWork();

                        // 发送报文注册客户端
                        MSGTYPE msg = new MSGTYPE();
                        msg.SeqID          = CommandProcessor.AllocateID();
                        msg.TK_CommandType = Constants.TK_CommandType.REGISTERCLIENT;
                        msg.SetValue("ClientID", id);
                        msg.SetValue("SERVERNAME", Name);
                        msg.SetValue(Constants.MSG_PARANAME_AUTHORIZED, false);
                        CommandProcessor.instance().DispatchCommand(msg);

                        SendLog("客户端 " + newclient.RemoteEndPoint.ToString() + " 连接到:" + Name);

                        SendLog(Name + "当前客户端的数量:" + m_ClientCommunicators.Count);

                        //int wt, iot;
                        //ThreadPool.GetAvailableThreads(out wt, out iot);
                        //SendLog("可用工作线程数: " + wt + " I/O线程数: " + iot);
                    }
                    catch (Exception ex)
                    {
                        try
                        {
                            newclient.Close();
                            SendLog(ex.ToString());
                        }
                        catch { }
                    }
                }
            } // endlock

            if (Interlocked.Read(ref m_Run) == 1)
            {
                _asyncAccepter();
            }
        }