/// <summary> /// Receives data from the network and handles it appropriately. /// </summary> /// <param name="peer">Peer.</param> /// <param name="reader">Reader.</param> /// <param name="deliveryMethod">Delivery method.</param> void NetworkReceive(NetPeer peer, NetPacketReader reader, DeliveryMethod deliveryMethod) { if (deliveryMethod != Method) { Logger("Wrong delivery method from peer " + peer.EndPoint.ToString() + "."); } int Reference = reader.GetByte() + reader.GetByte() * 256 + reader.GetByte() * 65536 + reader.GetByte() * 16777216; remote = peer; /* Is a reply? */ bool IsPWaited; PeerWaiter Wtr = null; lock (Waiter) if (Waiter.ContainsKey(Reference)) { IsPWaited = true; Wtr = Waiter[Reference]; } else { IsPWaited = false; } /* Pass back reply */ if (IsPWaited) { Wtr.Data = reader.GetRemainingBytes(); Wtr.Barrier.Set(); return; } /* Handle request */ byte[] Resp = DataCallbacks[Reference](reader.RawData, reader.UserDataOffset + 4, reader.UserDataSize - 4, out int Of, out int Oc); byte[] DtS = new byte[Resp.Length + 4]; DtS[0] = (byte)(Reference % 256); DtS[1] = (byte)(Reference / 256 % 256); DtS[2] = (byte)(Reference / 65536 % 256); DtS[3] = (byte)(Reference / 16777216 % 256); Buffer.BlockCopy(Resp, Of, DtS, 4, Oc); peer.Send(DtS, Method); }
/// <summary> /// Send followed by receive. /// </summary> /// <param name="Reference">Data reference.</param> /// <param name="Data">Data array.</param> /// <param name="Count">Amount of bytes from the data array to send.</param> public byte[] SendReceive(int Reference, byte[] Data, int Count) { object lockroot; lock (SyncRoots) if (!SyncRoots.ContainsKey(Reference)) { SyncRoots.Add(Reference, lockroot = new object()); } else { lockroot = SyncRoots[Reference]; } lock (lockroot) { /* Create waiter */ PeerWaiter pw = new PeerWaiter() { Num = Reference, Data = Data, Barrier = new AutoResetEvent(false) }; lock (Waiter) Waiter.Add(Reference, pw); byte[] DtS = new byte[Count + 4]; DtS[0] = (byte)(Reference % 256); DtS[1] = (byte)(Reference / 256 % 256); DtS[2] = (byte)(Reference / 65536 % 256); DtS[3] = (byte)(Reference / 16777216 % 256); Buffer.BlockCopy(Data, 0, DtS, 4, Count); remote.Send(DtS, Method); /* Wait for reply */ pw.Barrier.WaitOne(); lock (Waiter) Waiter.Remove(Reference); pw.Barrier.Dispose(); return(pw.Data); } }