/// <summary> /// 패킷을 전송한다. /// 큐가 비어 있을 경우에는 큐에 추가한 뒤 바로 SendAsync매소드를 호출하고, /// 데이터가 들어있을 경우에는 새로 추가만 한다. /// /// 큐잉된 패킷의 전송 시점 : /// 현재 진행중인 SendAsync가 완료되었을 때 큐를 검사하여 나머지 패킷을 전송한다. /// </summary> /// <param name="msg"></param> public void send(CPacket msg) { // 헤더에 패킷 사이즈를 기록한다. msg.record_size(); CPacket[] clones = CPacket.split(msg); foreach (var clone in clones) { lock (this.cs_sending_queue) { // 큐가 비어 있다면 큐에 추가하고 바로 비동기 전송 매소드를 호출한다. if (this.sending_queue.Count <= 0) { this.sending_queue.Enqueue(clone); start_send(); continue; } // 큐에 무언가가 들어 있다면 아직 이전 전송이 완료되지 않은 상태이므로 큐에 추가만 하고 리턴한다. // 현재 수행중인 SendAsync가 완료된 이후에 큐를 검사하여 데이터가 있으면 SendAsync를 호출하여 전송해줄 것이다. Console.WriteLine("Queue is not empty. Copy and Enqueue a msg. protocol id : " + msg.protocol_id); this.sending_queue.Enqueue(clone); } } }