Beispiel #1
0
        private void OnSendCompleted(SocketAsyncEventArgs e)
        {
            if (e.SocketError == SocketError.Success &&
                e.BytesTransferred > 0)
            {
                Interlocked.Increment(ref _statistic.TcpSentCount);
                Interlocked.Add(ref _statistic.TcpSentBytes, e.BytesTransferred);
            }
            else
            {
                Close();
                return;
            }

            var total = _sendedBufferList.TotalSegmentCount;

            if (total != e.BytesTransferred)
            {
                // 덜 전송되었다!
                _logger.LogWarning($"sended {e.BytesTransferred}/{total} bytes");
                _sendedBufferList.LeftTrim(e.BytesTransferred);
                SendAsync(_sendedBufferList);
                return;
            }

            bool remainSend = false;

            lock (_sendedList)
            {
                // 다 보냈으니 지운다
                foreach (NetPacket packet in _sendedList)
                {
                    NetPool.PacketPool.Free(packet);
                }

                _sendedList.Clear();
                _sendedBufferList.Clear();

                if (_sendWaitQueue.Count > 0)
                {
                    foreach (NetPacket packet in _sendWaitQueue)
                    {
                        _sendedBufferList.Push(new ArraySegment <byte>(packet.RawData, 0, packet.Size));
                    }

                    List <NetPacket> tempList = _sendWaitQueue;
                    _sendWaitQueue = _sendedList;
                    _sendedList    = tempList;

                    remainSend = true;
                }
            }

            if (remainSend == true)
            {
                // 못보낸거 보내자
                SendAsync(_sendedBufferList);
            }
        }