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