// Read a packet from a connection // DataAvailable flag must be true before calling private void ReadPacket(RobotConnection conn) { NetworkStream stream = conn.tcpClient.GetStream(); // Read Header int bytesRead = stream.Read(recvBuf, 0, 5); // Check the read is successful if (bytesRead != 5) { // If failed, flush the read buffer Debug.Log("Failed to read packet header"); EyesimLogger.instance.Log("Server: Packet read failure"); while (stream.DataAvailable) { stream.Read(recvBuf, 0, recvBuf.Length); } return; } uint dataSize = BitConverter.ToUInt32(recvBuf, 1); if (BitConverter.IsLittleEndian) { dataSize = RobotFunction.ReverseBytes(dataSize); } int packetType = recvBuf[0]; // Read Body if (dataSize > 0) { bytesRead = stream.Read(recvBuf, 0, (int)dataSize); } switch (packetType) { case PacketType.CLIENT_HANDSHAKE: if (conn.robot == null) { } break; case PacketType.CLIENT_MESSAGE: interpreter.ReceiveCommand(recvBuf, conn); break; case PacketType.CLIENT_DISCONNECT: Debug.Log("Client requested disconnect"); CloseConnection(conn); break; default: break; } }
internal void WritePacket(RobotConnection conn, Packet packet) { byte[] sendBuf = new byte[packet.dataSize + 5]; UInt32 size = packet.dataSize; if (BitConverter.IsLittleEndian) { size = RobotFunction.ReverseBytes(size); } sendBuf[0] = Convert.ToByte(packet.packetType); BitConverter.GetBytes(size).CopyTo(sendBuf, 1); if (packet.dataSize > 0) { packet.data.CopyTo(sendBuf, 5); } NetworkStream stream = conn.tcpClient.GetStream(); stream.Write(sendBuf, 0, ((int)packet.dataSize) + 5); }