/// <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); }
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); } }
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); } }