Ejemplo n.º 1
0
        /// <summary>
        /// 비동기 전송 완료시 호출되는 콜백 매소드.
        /// </summary>
        /// <param name="e"></param>
        public void process_send(SocketAsyncEventArgs e)
        {
            if (e.BytesTransferred <= 0 || e.SocketError != SocketError.Success)
            {
                //Console.WriteLine(string.Format("Failed to send. error {0}, transferred {1}", e.SocketError, e.BytesTransferred));
                return;
            }

            lock (this.cs_sending_queue)
            {
                // count가 0이하일 경우는 없겠지만...
                if (this.sending_queue.Count <= 0)
                {
                    throw new Exception("Sending queue count is less than zero!");
                }

                //todo:재전송 로직 다시 검토~~ 테스트 안해봤음.
                // 패킷 하나를 다 못보낸 경우는??
                int size = this.sending_queue.Peek().position;
                if (e.BytesTransferred != size)
                {
                    string error = string.Format("Need to send more! transferred {0},  packet size {1}", e.BytesTransferred, size);
                    Console.WriteLine(error);

                    // 남은 데이터 만큼 버퍼를 재설정 해주고 다시 전송한다.
                    e.SetBuffer(e.Offset, size - e.BytesTransferred);
                    bool pending = this.socket.SendAsync(e);
                    if (!pending)
                    {
                        process_send(this.send_event_args);
                    }

                    return;
                }


                //System.Threading.Interlocked.Increment(ref sent_count);
                lock (cs_count)
                {
                    ++sent_count;
                    //if (sent_count % 20000 == 0)
                    {
                        Console.WriteLine(string.Format("process send : {0}, transferred {1}, sent count {2}",
                                                        e.SocketError, e.BytesTransferred, sent_count));
                    }
                }

                //Console.WriteLine(string.Format("process send : {0}, transferred {1}, sent count {2}",
                //	e.SocketError, e.BytesTransferred, sent_count));

                // 전송 완료된 패킷을 큐에서 제거한다.
                CPacket packet = this.sending_queue.Dequeue();
                CPacket.destroy(packet);

                // 아직 전송하지 않은 대기중인 패킷이 있다면 다시한번 전송을 요청한다.
                if (this.sending_queue.Count > 0)
                {
                    start_send();
                }
            }
        }