protected RadiusResponse receive(RadiusRequest req) throws Exception {
    RadiusResponse res = null;
    DataInputStream in = new DataInputStream(socket.getInputStream());

    synchronized (in) {
      if (statusListener != null) statusListener.onBeforeReceive(this);

      int code = RadiusFormat.readUnsignedByte(in);
      int identifier = RadiusFormat.readUnsignedByte(in);
      int length = RadiusFormat.readUnsignedShort(in);

      buffer_in.clear();
      buffer_in.limit(in.read(buffer_in.array(), 0, length));

      res = (RadiusResponse) PacketFactory.parseUDP(code, identifier, length, buffer_in, false);

      if (statusListener != null) statusListener.onAfterReceive(this, res);
    }

    return res;
  }