コード例 #1
0
ファイル: RTProtocol.cs プロジェクト: armonnaeini/vr-midterm
        /// <summary>
        /// Send discovery packet to network to find available QTM Servers.
        ///</summary>
        /// <param name="replyPort">port for servers to reply.</param>
        /// <param name="discoverPort">port to send discovery packet.</param>
        /// <returns>true if discovery packet was sent successfully</returns>
        public bool DiscoverRTServers(ushort replyPort, ushort discoverPort = Constants.STANDARD_BROADCAST_PORT)
        {
            byte[] port = BitConverter.GetBytes(replyPort);
            byte[] size = BitConverter.GetBytes(10);
            byte[] cmd  = BitConverter.GetBytes((int)PacketType.PacketDiscover);

            Array.Reverse(port);

            List <byte> b = new List <byte>();

            b.AddRange(size);
            b.AddRange(cmd);
            b.AddRange(port);

            byte[] msg = b.ToArray();

            //if we don't have a udp broadcast socket, create one
            if (mBroadcastSocketCreated || mNetwork.CreateUDPSocket(ref replyPort, true))
            {
                mBroadcastSocketCreated = true;
                var sendStatus = mNetwork.SendUDPBroadcast(msg, 10);
                if (!sendStatus)
                {
                    // Something major failed when trying to broadcast
                    return(false);
                }

                mDiscoveryResponses.Clear();

                const int discoverBufferSize = 65535;
                byte[]    discoverBuffer     = new byte[discoverBufferSize];
                int       received           = 0;
                do
                {
                    EndPoint remoteEP = new IPEndPoint(IPAddress.Any, 0);
                    received = mNetwork.ReceiveBroadcast(ref discoverBuffer, discoverBufferSize, ref remoteEP, 100000);
                    if (received != -1 && received > 8)
                    {
                        var packetType = RTPacket.GetPacketType(discoverBuffer);
                        if (packetType == PacketType.PacketCommand)
                        {
                            DiscoveryResponse response;
                            if (GetDiscoverData(discoverBuffer, out response))
                            {
                                response.IpAddress = (remoteEP as IPEndPoint).Address.ToString();
                                mDiscoveryResponses.Add(response);
                            }
                        }
                    }
                }while (received != -1 && received > 8);
            }

            return(true);
        }
コード例 #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 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);
            }
        }
コード例 #3
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);
            }
        }