Exemplo n.º 1
0
        public int ReceiveRTPacket(out PacketType packetType, bool skipEvents = true, int timeout = 500000)
        {
            lock (receiveLock)
            {
                int receivedTotal = 0;
                int frameSize;

                packetType = PacketType.PacketNone;

                do
                {
                    receivedTotal = 0;

                    int received = mNetwork.Receive(ref data, 0, data.Length, true, timeout);
                    if (received == 0)
                    {
                        return(0); // Receive timeout
                    }
                    if (received < sizeof(int) * 2)
                    {
                        // QTM header not received.
                        return(-1);
                    }
                    if (received == -1)
                    {
                        if (!mNetwork.IsConnected())
                        {
                            mErrorString = "Disconnected from server.";
                        }
                        else
                        {
                            mErrorString = "Socket Error.";
                        }
                        return(-1);
                    }
                    receivedTotal += received;

                    frameSize  = RTPacket.GetPacketSize(data);
                    packetType = RTPacket.GetPacketType(data);

                    if (data == null || frameSize > data.Length)
                    {
                        // Do some preventive additional allocation to reduce number of times allocation is needed
                        var newSize = (int)(frameSize * 1.47);
                        Array.Resize(ref data, newSize);
                    }

                    // Receive more data until we have read the whole packet
                    while (receivedTotal < frameSize)
                    {
                        // As long as we haven't received enough data, wait for more
                        received = mNetwork.Receive(ref data, receivedTotal, frameSize - receivedTotal, false, timeout);
                        if (received <= 0)
                        {
                            if (!mNetwork.IsConnected())
                            {
                                mErrorString = "Disconnected from server.";
                            }
                            else
                            {
                                mErrorString = "Socket Error.";
                            }
                            return(-1);
                        }
                        receivedTotal += received;
                    }
                    mPacket.SetData(data);
                }while (skipEvents && packetType == PacketType.PacketEvent);

                if (receivedTotal == frameSize)
                {
                    return(receivedTotal);
                }
                mErrorString = "Packet truncated.";
                return(-1);
            }
        }
Exemplo n.º 2
0
        public int ReceiveRTPacket(out PacketType packetType, bool skipEvents = true, int timeout = 500000)
        {
            lock (receiveLock)
            {
                int receivedTotal = 0;
                int frameSize;

                packetType = PacketType.PacketNone;

                do
                {
                    receivedTotal = 0;

                    int received = mNetwork.Receive(ref header, RTProtocol.Constants.PACKET_HEADER_SIZE, true, timeout);
                    if (received == 0)
                    {
                        return(0); // Receive timeout
                    }
                    if (received < sizeof(int) * 2)
                    {
                        // QTM header not received.
                        return(-1);
                    }
                    if (received == -1)
                    {
                        if (!mNetwork.IsConnected())
                        {
                            mErrorString = "Disconnected from server.";
                        }
                        else
                        {
                            mErrorString = "Socket Error.";
                        }
                        return(-1);
                    }
                    receivedTotal += received;

                    frameSize  = RTPacket.GetPacketSize(header);
                    packetType = RTPacket.GetPacketType(header);

                    if (data == null || frameSize > data.Length)
                    {
                        data = new byte[frameSize];
                    }
                    header.CopyTo(data, 0);

                    // Receive more data until we have read the whole packet
                    while (receivedTotal < frameSize)
                    {
                        // As long as we haven't received enough data, wait for more
                        byte[] buffer = new byte[frameSize - receivedTotal];
                        received = mNetwork.Receive(ref buffer, frameSize - receivedTotal, false, timeout);
                        buffer.CopyTo(data, receivedTotal);
                        if (received <= 0)
                        {
                            if (!mNetwork.IsConnected())
                            {
                                mErrorString = "Disconnected from server.";
                            }
                            else
                            {
                                mErrorString = "Socket Error.";
                            }
                            return(-1);
                        }
                        receivedTotal += received;
                    }

                    mPacket.SetData(data);
                }while (skipEvents && packetType == PacketType.PacketEvent);

                if (receivedTotal == frameSize)
                {
                    return(receivedTotal);
                }
                mErrorString = "Packet truncated.";
                return(-1);
            }
        }