private void ReceiveCompleted(object obj, SocketAsyncEventArgs evt) { if (false == ClientSocket.Connected || 0 == evt.BytesTransferred) { //서버로 부터 데이터를 0받을시 Reconnect(); return; } //전체사이즈 int Size = evt.BytesTransferred; int CSize = BitConverter.ToUInt16(evt.Buffer, 0); //실제 사이즈와 적힌 사이즈가 다를경우 방지 if (Size == CSize) { //패킷 생성 GCHandle Handle = GCHandle.Alloc(evt.Buffer, GCHandleType.Pinned); JRecvPacket RecvPacket = (JRecvPacket)Marshal.PtrToStructure(Handle.AddrOfPinnedObject(), typeof(JRecvPacket)); Handle.Free(); RecvQue.Clear(); int count = 0; //버퍼->큐에저장 foreach (byte value in RecvPacket.RecvBuf) { RecvQue.Enqueue(value); count++; if (RecvPacket.RecvBuf[count] == 0 && RecvPacket.RecvBuf[count - 1] == 0) { break; } } //큐에 저장완료 RecvSucces = true; } _Message = "Receive Check OKK"; evt.SetBuffer(RecvBuf, 0, RecvBuf.Length); //비동기 재설정 ClientSocket.ReceiveAsync(evt); }
//큐제거하고 반환 public static byte Deque() { return(RecvQue.Dequeue()); }