public uint Read(out byte[] data) { if (!mailslot.IsValid()) { throw new Exception("Mailslot handle is invalid."); } uint bytesRead = 0; try { var info = mailslot.GetMailslotInfo(); if (info.MessageCount == 0) { data = new byte[] { }; return(0); } data = new byte[info.NextMessageSize]; WinFunctions.ReadFile(mailslot.Handle, data, (uint)data.Length, out bytesRead, IntPtr.Zero); } catch (Exception ex) { if (!IsRunning) { data = new byte[] {}; return(bytesRead); } data = new byte[] { }; WinFunctions.ThrowException("Read failed.", ex); } return(bytesRead); }
private void ReceiveCards() { int clientMailslotHandle; // дескриптор мэйлслота clientMailslotHandle = Mailslot.CreateMailslot("\\\\.\\mailslot\\ReceiveCardsMailslot", 0, Types.MAILSLOT_WAIT_FOREVER, 0); Card card = new Card(); // прочитанное сообщение Card prevCard = new Card(); // для проверки в случае, когда отправляется одно и то же сообщение несколько раз int mailslotSize = 0; // максимальный размер сообщения int nextMessageSize = 0; // размер следующего сообщения int messageCount = 0; // количество сообщений в мэйлслоте uint realBytesReaded = 0; // количество реально прочитанных из мэйлслота байтов while (work) { Mailslot.GetMailslotInfo(clientMailslotHandle, mailslotSize, ref nextMessageSize, ref messageCount, 0); if (messageCount > 0) { for (int i = 0; i < messageCount; i++) { byte[] bytes = new byte[400]; // "Принудительная" запись данных, расположенные в буфере операционной системы, в файл мэйлслота Mailslot.FlushFileBuffers(clientMailslotHandle); Mailslot.ReadFile(clientMailslotHandle, bytes, 400, ref realBytesReaded, 0); BinaryFormatter formatter = new BinaryFormatter(); using (MemoryStream memory = new MemoryStream(bytes)) { card = (Card)formatter.Deserialize(memory); // Если пришла карта с CardSuit.Count, CardQuality.Count (признак окончания раздачи) очищаем столл if (card.Equals(new Card(CardSuit.Count, CardQuality.Count))) { CleanTable(); continue; } if (!card.Equals(prevCard)) { prevCard = card; } else { continue; } } Invoke(new MethodInvoker(() => { // Выдаем карты на flop'е if (pbFlop1.Image == null) { pbFlop1.Image = Image.FromFile("../../Images/Cards/" + card.suit.ToString() + card.quality.ToString() + ".png"); return; } if (pbFlop2.Image == null) { pbFlop2.Image = Image.FromFile("../../Images/Cards/" + card.suit.ToString() + card.quality.ToString() + ".png"); return; } if (pbFlop3.Image == null) { pbFlop3.Image = Image.FromFile("../../Images/Cards/" + card.suit.ToString() + card.quality.ToString() + ".png"); return; } // Выдаем карты на turn'е if (pbTurn.Image == null) { pbTurn.Image = Image.FromFile("../../Images/Cards/" + card.suit.ToString() + card.quality.ToString() + ".png"); return; } // Выдаем карты на river'е if (pbRiver.Image == null) { pbRiver.Image = Image.FromFile("../../Images/Cards/" + card.suit.ToString() + card.quality.ToString() + ".png"); return; } })); Thread.Sleep(500); } } } }