示例#1
0
        private void AddTcpSocketSession(Socket client)
        {
            if (client == null)
            {
                return;
            }

            lock (ChannelManager.SyncLock)
            {
                ISocketAsyncEventArgsProxy socketProxy = this._SocketAsyncPool.Pop();
                if (socketProxy == null)
                {
                    AsyncUtil.AsyncRun(client.SafeClose);
                    Logger.Info(false, "已经到达最大连接数");
                    return;
                }

                ISocketSession socketSession = new TcpSocketSession(client, (IPEndPoint)client.RemoteEndPoint, socketProxy);
                socketSession.Setup(this);
                socketSession.Initialize();

                if (ChannelManager.AddChannel(socketSession.SessionID, socketSession))
                {
                    socketSession.CloseSocket += socketChannel_CloseSocket;
                    if (ServerConfig.ControlMode == ControlMode.Self ||
                        ServerConfig.ControlMode == ControlMode.Parallel ||
                        ServerConfig.ControlMode == ControlMode.Singleton)
                    {
                        socketSession.SocketReceiveData += socketChannel_SocketReceiveData;
                        AsyncUtil.AsyncRun(socketSession.TryReceive);
                    }

                    OnSocketConnected(socketSession.RemoteIP, socketSession.RemotePort);

                    OnChannelChanged(socketSession.RemoteIP, CommunicateType.NET, ChannelState.Open);

                    Logger.Info(false, String.Format("增加远程连接>>{0}:{1} 成功", socketSession.RemoteIP, socketSession.RemotePort));
                }
                else
                {
                    ISocketAsyncEventArgsProxy proxy = socketSession.SocketAsyncProxy;
                    proxy.Reset();
                    if (proxy.SocketReceiveEventArgsEx.InitOffset != proxy.SocketReceiveEventArgsEx.Offset)
                    {
                        proxy.SocketReceiveEventArgsEx.SetBuffer(proxy.SocketReceiveEventArgsEx.InitOffset, ServerConfig.NetReceiveBufferSize);
                    }
                    _SocketAsyncPool.Push(proxy);
                    socketSession.Close();
                    socketSession = null;
                    Logger.Info(true, String.Format("增加远程连接>>{0}:{1} 失败", socketSession.RemoteIP, socketSession.RemotePort));
                }
            }
        }
示例#2
0
        private void InitSocketAsyncPool()
        {
            int netReceiveBufferSize = ServerConfig.NetReceiveBufferSize;

            if (netReceiveBufferSize <= 0)
            {
                netReceiveBufferSize = 1024;
            }

            _BufferManager = new BufferManager(netReceiveBufferSize * ServerConfig.MaxConnects, netReceiveBufferSize);

            try
            {
                _BufferManager.InitBuffer();
            }
            catch (Exception ex)
            {
                Logger.Error(true, "", ex);
                throw;
            }

            _SocketAsyncPool = new SocketAsyncEventArgsProxyPool();

            SocketAsyncEventArgsEx socketEventArg;

            for (int i = 0; i < ServerConfig.MaxConnects; i++)
            {
                socketEventArg = new SocketAsyncEventArgsEx();
                _BufferManager.SetBuffer(socketEventArg);
                socketEventArg.Initialize();//初始化缓存接口
                _SocketAsyncPool.Push(new SocketAsyncEventArgsProxy(socketEventArg));
            }
        }