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)); } } }
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)); } }