Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
            }
        }
Esempio n. 3
0
        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);
            }
        }