private bool SendStart() { Debug.Assert(_state == State.Buffering); Debug.Assert(_sending.Count == 0); if (_pushed.Count == 0) { // simple case - only the _tail.Data needs to be transmit _socketEvent.BufferList = null; _socketEvent.SetBuffer(_tail.Data.Array, _tail.Data.Offset, _tail.Data.Count); } else { // complex case - move _pushed segments to _sending var empty = _sending; _sending = _pushed; _pushed = empty; // make a buffer list of all _sending[].Data and _tail.Data var bufferList = new ArraySegment <byte> [_sending.Count + 1]; for (var index = 0; index != _sending.Count; ++index) { bufferList[index] = _sending[index].Data; } bufferList[_sending.Count] = _tail.Data; if (_socketEvent.Buffer != null) { _socketEvent.SetBuffer(null, 0, 0); } _socketEvent.BufferList = bufferList; } // cursor is advanced past this point, further buffering will copy after this mark _tail.Data = new ArraySegment <byte>(_tail.Data.Array, _tail.Data.Offset + _tail.Data.Count, 0); // alloc an action field lazily. assign that field to this property only while an async operation is outstanding if (_socketEventCompleted == null) { _socketEventCompleted = SocketEventCompleted; } _socketEvent.Completed = _socketEventCompleted; if (!_socket.SendAsync(_socketEvent)) { _socketEvent.Completed = null; return(false); } return(true); }
public void Execute() { _services.Trace.Event(TraceEventType.Start, TraceMessage.Connection); _baton = new Baton(_services.Memory); _fault = ex => { Debug.WriteLine(ex.Message); }; _receiveSocketEvent = _services.Memory.AllocSocketEvent(); _receiveSocketEvent.SetBuffer(_services.Memory.Empty, 0, 0); _frameConsumeCallback = frame => { try { Go(false, frame); } catch (Exception ex) { _fault(ex); } }; try { _socket.Blocking = false; _socket.NoDelay = true; Go(true, null); } catch (Exception ex) { _fault(ex); } }
public void Execute() { _services.Trace.Event(TraceEventType.Start, TraceMessage.Connection); _baton = new Baton(_services.Memory); _fault = ex => { Debug.WriteLine(ex.Message); }; _receiveSocketEvent = _services.Memory.AllocSocketEvent(); _receiveSocketEvent.SetBuffer(_services.Memory.Empty, 0, 0); _frameConsumeCallback = (frame, error) => { if (error != null) { _fault(error); } try { Go(false, frame); } catch (Exception ex) { _fault(ex); } }; try { _socket.Blocking = false; _socket.NoDelay = true; Go(true, null); } catch (Exception ex) { _fault(ex); } }