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