예제 #1
0
        public TcpClient(string host, int port)
        {
            this.Host = host;
            this.Port = port;

            UserTokenSession Session = new UserTokenSession();
            //初始化发送接套字
            SendEventArgs SendEvent = new SendEventArgs();

            SendEvent.Completed += AsyncDispatchCenter;
            SendEvent.UserToken  = Session;
            SendEvent.SendAction = ProcessSend;

            //初始化接收接套字
            ReceiveBuffer = new byte[BufferSize];
            ReceiveEventArgs ReceiveEvent = new ReceiveEventArgs();

            ReceiveEvent.Completed    += AsyncDispatchCenter;
            ReceiveEvent.UserToken     = Session;
            ReceiveEvent.ReceiveAction = ProcessReceive;
            Buffer.SetBuffer(ReceiveEvent, ReceiveBuffer);

            ShakeHandEvent               = new ShakeHandEventArgs(ReceiveEvent, SendEvent);
            ShakeHandEvent.Completed    += AsyncDispatchCenter;
            ShakeHandEvent.ConnectAction = StartConnect;
            Session.ShakeHandEvent       = ShakeHandEvent;
            Session.Mode             = ApplyMode.Client;
            ShakeHandEvent.UserToken = Session;
        }
예제 #2
0
        /// <summary>
        /// 接收池
        /// </summary>
        /// <param name="BufferSize"></param>
        /// <param name="PoolSize"></param>
        /// <param name="AcceptCompleted"></param>
        /// <param name="IOCompleted"></param>
        public ShakeHandEventArgsPool(int BufferSize, int PoolSize, EventHandler <SocketAsyncEventArgs> DispatchCenter)
        {
            ShakeHandPool     = new ConcurrentStack <ShakeHandEventArgs>();
            ReceiveBufferPool = new BufferPool(BufferSize, PoolSize);
            SendBufferPool    = new BufferPool(BufferSize, PoolSize);
            for (int i = 0; i < PoolSize; i++)
            {
                UserTokenSession userToken        = new UserTokenSession();
                ReceiveEventArgs receiveEventArgs = new ReceiveEventArgs();
                receiveEventArgs.UserToken  = userToken;
                receiveEventArgs.Completed += DispatchCenter;
                Buffer.SetBuffer(receiveEventArgs, ReceiveBufferPool.Pop());

                SendEventArgs senEventArgs = new SendEventArgs();
                senEventArgs.UserToken  = userToken;
                senEventArgs.Completed += DispatchCenter;
                Buffer.SetBuffer(senEventArgs, SendBufferPool.Pop());

                ShakeHandEventArgs acceptEventArgs = new ShakeHandEventArgs(receiveEventArgs, senEventArgs);
                acceptEventArgs.Completed += DispatchCenter;
                acceptEventArgs.UserToken  = userToken;

                ShakeHandPool.Push(acceptEventArgs);
            }
        }
예제 #3
0
        void ProcessSend(SocketAsyncEventArgs e)
        {
            SendEventArgs    eventArgs = (SendEventArgs)e;
            UserTokenSession UserToken = (UserTokenSession)eventArgs.UserToken;

            switch (eventArgs.SocketError)
            {
            //需要重新连接
            case SocketError.ConnectionReset:
                UserToken.NoSuccessMessage.Enqueue(eventArgs.MemoryBuffer.ToArray());
                StartConnect();
                break;

            //成功就不需要任何操作了
            case SocketError.Success:
                break;

            default:
                break;
            }
        }
예제 #4
0
 /// <summary>
 /// 构造函数
 /// </summary>
 /// <param name="ReceiveEventArgs">接收使用的接套字</param>
 /// <param name="SendEventArgs">发送使用的接套字</param>
 internal ShakeHandEventArgs(ReceiveEventArgs ReceiveEventArgs, SendEventArgs SendEventArgs)
 {
     this.ReceiveEventArgs = ReceiveEventArgs;
     this.SendEventArgs    = SendEventArgs;
 }
예제 #5
0
 void ProcessSend(SocketAsyncEventArgs e)
 {
     SendEventArgs    eventArgs = (SendEventArgs)e;
     UserTokenSession UserToken = (UserTokenSession)eventArgs.UserToken;
 }