예제 #1
0
        /// <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);
        }
예제 #2
0
        /// <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);
            }
        }