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