Ejemplo n.º 1
0
 /// <summary>
 /// Instantiates.
 /// </summary>
 /// <param name="service">the service this session belongs to</param>
 /// <param name="processor">the processor to process this session</param>
 /// <param name="socket">the associated socket</param>
 /// <param name="readBuffer">the <see cref="SocketAsyncEventArgsBuffer"/> as reading buffer</param>
 /// <param name="writeBuffer">the <see cref="SocketAsyncEventArgsBuffer"/> as writing buffer</param>
 /// <param name="reuseBuffer">whether or not reuse internal buffer, see <seealso cref="SocketSession.ReuseBuffer"/> for more</param>
 public AsyncSocketSession(IoService service, IoProcessor<SocketSession> processor, System.Net.Sockets.Socket socket,
     SocketAsyncEventArgsBuffer readBuffer, SocketAsyncEventArgsBuffer writeBuffer, Boolean reuseBuffer)
     : base(service, processor, new SessionConfigImpl(socket), socket, socket.LocalEndPoint, socket.RemoteEndPoint, reuseBuffer)
 {
     _readBuffer = readBuffer;
     _readBuffer.SocketAsyncEventArgs.UserToken = this;
     _writeBuffer = writeBuffer;
     _writeBuffer.SocketAsyncEventArgs.UserToken = this;
     _completeHandler = saea_Completed;
 }
Ejemplo n.º 2
0
 /// <summary>
 /// Instantiates.
 /// </summary>
 /// <param name="service">the service this session belongs to</param>
 /// <param name="processor">the processor to process this session</param>
 /// <param name="socket">the associated socket</param>
 /// <param name="readBuffer">the <see cref="SocketAsyncEventArgsBuffer"/> as reading buffer</param>
 /// <param name="writeBuffer">the <see cref="SocketAsyncEventArgsBuffer"/> as writing buffer</param>
 /// <param name="reuseBuffer">whether or not reuse internal buffer, see <seealso cref="SocketSession.ReuseBuffer"/> for more</param>
 public AsyncSocketSession(IoService service, IoProcessor <SocketSession> processor, System.Net.Sockets.Socket socket,
                           SocketAsyncEventArgsBuffer readBuffer, SocketAsyncEventArgsBuffer writeBuffer, Boolean reuseBuffer)
     : base(service, processor, new SessionConfigImpl(socket), socket, socket.LocalEndPoint, socket.RemoteEndPoint, reuseBuffer)
 {
     _readBuffer = readBuffer;
     _readBuffer.SocketAsyncEventArgs.UserToken = this;
     _writeBuffer = writeBuffer;
     _writeBuffer.SocketAsyncEventArgs.UserToken = this;
     _completeHandler = saea_Completed;
 }
Ejemplo n.º 3
0
        /// <inheritdoc/>
        protected override void BeginSend(IWriteRequest request, IoBuffer buf)
        {
            SocketAsyncEventArgs       saea;
            SocketAsyncEventArgsBuffer saeaBuf = buf as SocketAsyncEventArgsBuffer;

            if (saeaBuf == null)
            {
                _writeBuffer.Clear();
                if (_writeBuffer.Remaining < buf.Remaining)
                {
                    Int32 oldLimit = buf.Limit;
                    buf.Limit = buf.Position + _writeBuffer.Remaining;
                    _writeBuffer.Put(buf);
                    buf.Limit = oldLimit;
                }
                else
                {
                    _writeBuffer.Put(buf);
                }
                _writeBuffer.Flip();
                _writeBuffer.SetBuffer();
                saea = _writeBuffer.SocketAsyncEventArgs;
            }
            else
            {
                saea            = saeaBuf.SocketAsyncEventArgs;
                saea.Completed += _completeHandler;
            }

            Boolean willRaiseEvent;

            try
            {
                willRaiseEvent = Socket.SendAsync(saea);
            }
            catch (ObjectDisposedException)
            {
                // do nothing
                return;
            }
            catch (SocketException ex)
            {
                EndSend(ex);
                return;
            }
            catch (Exception ex)
            {
                EndSend(ex);
                return;
            }
            if (!willRaiseEvent)
            {
                ProcessSend(saea);
            }
        }
            public SocketContext(System.Net.Sockets.Socket socket, IoSessionConfig config)
            {
                _socket = socket;

                _completeHandler = OnCompleted;

                Byte[] writeBuffer = new Byte[config.ReadBufferSize];
                _writeBuffer = SocketAsyncEventArgsBufferAllocator.Instance.Wrap(writeBuffer);
                _writeBuffer.SocketAsyncEventArgs.Completed += new EventHandler<SocketAsyncEventArgs>(OnCompleted);
                _writeBuffer.SocketAsyncEventArgs.UserToken = this;
            }
Ejemplo n.º 5
0
            public SocketContext(System.Net.Sockets.Socket socket, IoSessionConfig config)
            {
                _socket = socket;

                _completeHandler = OnCompleted;

                Byte[] writeBuffer = new Byte[config.ReadBufferSize];
                _writeBuffer = SocketAsyncEventArgsBufferAllocator.Instance.Wrap(writeBuffer);
                _writeBuffer.SocketAsyncEventArgs.Completed += new EventHandler <SocketAsyncEventArgs>(OnCompleted);
                _writeBuffer.SocketAsyncEventArgs.UserToken  = this;
            }
Ejemplo n.º 6
0
            private void BeginSend(AsyncDatagramSession session, IoBuffer buf, EndPoint remoteEP)
            {
                _writeBuffer.Clear();

                SocketAsyncEventArgs       saea;
                SocketAsyncEventArgsBuffer saeaBuf = buf as SocketAsyncEventArgsBuffer;

                if (saeaBuf == null)
                {
                    if (_writeBuffer.Remaining < buf.Remaining)
                    {
                        // TODO allocate a temp buffer
                    }
                    else
                    {
                        _writeBuffer.Put(buf);
                    }
                    _writeBuffer.Flip();
                    saea = _writeBuffer.SocketAsyncEventArgs;
                    saea.SetBuffer(saea.Offset + _writeBuffer.Position, _writeBuffer.Limit);
                }
                else
                {
                    saea            = saeaBuf.SocketAsyncEventArgs;
                    saea.Completed += _completeHandler;
                }

                saea.UserToken      = session;
                saea.RemoteEndPoint = remoteEP;

                Boolean willRaiseEvent;

                try
                {
                    willRaiseEvent = Socket.SendToAsync(saea);
                }
                catch (ObjectDisposedException)
                {
                    // do nothing
                    return;
                }
                catch (Exception ex)
                {
                    EndSend(session, ex);
                    return;
                }
                if (!willRaiseEvent)
                {
                    ProcessSend(saea);
                }
            }
Ejemplo n.º 7
0
        /// <inheritdoc/>
        protected override IoSession NewSession(IoProcessor <SocketSession> processor, System.Net.Sockets.Socket socket)
        {
            SocketAsyncEventArgsBuffer readBuffer  = _readWritePool.Pop();
            SocketAsyncEventArgsBuffer writeBuffer = _readWritePool.Pop();

            if (readBuffer == null)
            {
                readBuffer = (SocketAsyncEventArgsBuffer)
                             SocketAsyncEventArgsBufferAllocator.Instance.Allocate(SessionConfig.ReadBufferSize);
                readBuffer.SocketAsyncEventArgs.Completed += readWriteEventArg_Completed;
            }

            if (writeBuffer == null)
            {
                writeBuffer = (SocketAsyncEventArgsBuffer)
                              SocketAsyncEventArgsBufferAllocator.Instance.Allocate(SessionConfig.ReadBufferSize);
                writeBuffer.SocketAsyncEventArgs.Completed += readWriteEventArg_Completed;
            }

            return(new AsyncSocketSession(this, processor, socket, readBuffer, writeBuffer, ReuseBuffer));
        }
Ejemplo n.º 8
0
        private void InitBuffer()
        {
            Int32 bufferSize = SessionConfig.ReadBufferSize;

            if (_bufferManager == null || _bufferManager.BufferSize != bufferSize)
            {
                // TODO free previous pool

                _bufferManager = new BufferManager(bufferSize * MaxConnections * opsToPreAlloc, bufferSize);
                _bufferManager.InitBuffer();

                var list = new List <SocketAsyncEventArgsBuffer>(MaxConnections * opsToPreAlloc);
                for (Int32 i = 0; i < MaxConnections * opsToPreAlloc; i++)
                {
                    SocketAsyncEventArgs readWriteEventArg = new SocketAsyncEventArgs();
                    _bufferManager.SetBuffer(readWriteEventArg);
                    SocketAsyncEventArgsBuffer buf = new SocketAsyncEventArgsBuffer(readWriteEventArg);
                    list.Add(buf);

                    readWriteEventArg.Completed += new EventHandler <SocketAsyncEventArgs>(readWriteEventArg_Completed);
                }
            }
        }
Ejemplo n.º 9
0
        private void InitBuffer()
        {
            Int32 bufferSize = SessionConfig.ReadBufferSize;
            if (_bufferManager == null || _bufferManager.BufferSize != bufferSize)
            {
                // TODO free previous pool

                _bufferManager = new BufferManager(bufferSize * MaxConnections * opsToPreAlloc, bufferSize);
                _bufferManager.InitBuffer();

                var list = new List<SocketAsyncEventArgsBuffer>(MaxConnections * opsToPreAlloc);
                for (Int32 i = 0; i < MaxConnections * opsToPreAlloc; i++)
                {
                    SocketAsyncEventArgs readWriteEventArg = new SocketAsyncEventArgs();
                    _bufferManager.SetBuffer(readWriteEventArg);
                    SocketAsyncEventArgsBuffer buf = new SocketAsyncEventArgsBuffer(readWriteEventArg);
                    list.Add(buf);

                    readWriteEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(readWriteEventArg_Completed);
                }
                _readWritePool = new Pool<SocketAsyncEventArgsBuffer>(list);
            }
        }